一次从文件中挑出多行

时间:2016-08-20 11:06:28

标签: bash awk

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

我有一个数字列表。

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个过程中显示所有这些行的方法。

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)

您可以使用headtail来实现此目标。

Usng head将返回文件的第一行 n 行,tail将返回最后的 n 行,所以如果我想获得第5行:

cat file | head -n 5 | tail -n 1

应该做的伎俩。

ETA - 可能值得指出,你不能将0作为参数传递给.n选项,行数为1及以上而不是0及以上。

希望它有用。