不确定这是否可行但是这里 -
我有一个数字列表。
cat list
输出 -
1
22
53
75
我有一个500行(file.txt)的辅助文件。 我想从该文件中挑选出第1行,第22行,第53行和第75行。
我目前正在尝试的是 -
for i in `cat list`; do awk "NR==$i" file.txt ; done
这可行,但它真的很慢(我的实际文件有50k +行)。 我想知道是否有更有效的解决方案。也许是一种阅读列表并在一个过程而不是4个过程中显示所有这些行的方法。
答案 0 :(得分:5)
假设列表包含以下行:
$ cat list
1
22
53
75
基于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;"
基于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'
答案 1 :(得分:1)
使用GNU sed和GNU bash:
sed -n -f <(sed 's/.*/&p/' numbers.txt) file.txt
答案 2 :(得分:0)
这是另一个awk
awk -v nums="^($(paste -s -d"|" list))$" 'NR~nums' file
答案 3 :(得分:-1)
您可以使用head
和tail
来实现此目标。
Usng head将返回文件的第一行 n 行,tail将返回最后的 n 行,所以如果我想获得第5行:
cat file | head -n 5 | tail -n 1
应该做的伎俩。
ETA - 可能值得指出,你不能将0作为参数传递给.n选项,行数为1及以上而不是0及以上。
希望它有用。