不确定这是否可行但是这里 -
我有一个数字列表.
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个过程中显示所有这些行的方法.
假设列表包含以下行:
$ 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)