如何提取作为参数传递给 bash 脚本的特定行号的字段?

0 grep bash sed awk shell-script

我有一个文件名data.txt,内容如下:

 1           aFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
 2           bFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
 3           cFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
 4           dFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
 5           eFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
 6           fFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
 7           gFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
 8           hFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
 9           iFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
10           jFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
11           kFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf        IT524234
Run Code Online (Sandbox Code Playgroud)

请注意,第一个字段是行号。

现在我想构建一个 shell 脚本,以便我可以使用一些行号参数调用该脚本,并且它应该打印出data.txt. 例如: get.sh 1 3 5应该打印:

1           aFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf
3           cFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf
5           eFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf

Run Code Online (Sandbox Code Playgroud)

我认为 awk 只能用于打印第 1 个和第 2 个字段,但我坚持只根据传递给 shell 脚本的参数过滤特定行。提前致谢。

ilk*_*chu 5

在 awk 中,您可以将行号收集到一个数组中并读取一次文件,打印数组中提到的行:

#!/bin/sh
awk -v lines="$*" 'BEGIN { split(lines, a, "[, ]"); 
                           for (i in a) b[a[i]] = 1;}
                   NR in b {print $1, $2}' < data.txt
Run Code Online (Sandbox Code Playgroud)

split()分裂变量lines一起空格和逗号阵列a,以及for循环构建阵列b,使得数组含有我们感兴趣的行。然后NR in b,如果匹配当前的行号键存在只是检查。

请注意,这将只打印每一行一次,无论它在输入中存在多少次,并且这些行将打印输入数字顺序,而不是参数给出的顺序:

$ bash get.sh 7 3 3
3 cFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf
7 gFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf
Run Code Online (Sandbox Code Playgroud)

get.sh 7,3,3也有效)