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 脚本的参数过滤特定行。提前致谢。
在 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也有效)