一次从文件中挑出多行

Che*_*n17 0 bash awk

不确定这是否可行但是这里 -

我有一个数字列表.

cat list
Run Code Online (Sandbox Code Playgroud)

输出 -

1
22
53
75
Run Code Online (Sandbox Code Playgroud)

我有一个500行(file.txt)的辅助文件.我想从该文件中挑选出第1行,第22行,第53行和第75行.

我目前所尝试的是 -

for i in `cat list`; do awk "NR==$i" file.txt ; done
Run Code Online (Sandbox Code Playgroud)

这可行,但它真的很慢(我的实际文件有50k +行).我想知道是否有更有效的解决方案.也许是一种阅读列表并在一个过程而不是4个过程中显示所有这些行的方法.

ani*_*ane 5

假设列表包含以下行:

$ cat list
1
22
53
75
Run Code Online (Sandbox Code Playgroud)

基于sed + bash的方法:

$ a=($(<list))
# ^^ a will contain contents of 'list' in individual array elements.
$ sed -n "${a[*]/%/p;}" file.txt
# ^^ "${a[*]/%/p;}" will expand to "1p;22p;53p;75p;"
Run Code Online (Sandbox Code Playgroud)

基于awk的方法:

$ awk 'NR==FNR{a[$0]++; next;} (FNR in a)' list file.txt
# Array 'a' will contain 1 at indices equal to lines in 'list'
# Then match line numbers for second file, which are indices of 'a'
Run Code Online (Sandbox Code Playgroud)

  • @anishsane我在相同的100万输入行文件上重新运行测试,但现在使用10,000行nrs的行号文件,并使用`time`输出`真正的4m0.694s完成sed; 用户4m0.146s; sys 0m0.185s`当awk用`time`输出`real 0m2.527s完成; 用户0m2.464s; sys 0m0.061s`所以在这种情况下,对于awk**,sed**vs**2秒需要**4分钟. (2认同)