打印 "file2" 中所有行号存储在 "file1" $2 中的行

Print all lines in "file2" which have line number stored in "file1" $2

文件 1:

count    line_num  
xy       55  
ab       67 

文件 2:

a|b|c  
d|e|f  

我要打印file2的第55、67行号

正在尝试:

#!/usr/bin/ksh  
while read file_name; do  
    line_num=`echo $file_name | awk '{print }'`  
    awk 'NR==$line_num{print;exit}' file2 >> file3.txt  
done < file1  

但它不起作用!

使用 awk 你可以:

awk 'NR==FNR{line[]; next} FNR in line' file1 file2

我们迭代第一个文件并将第二列存储在名为 line 的映射中(我们可以通过执行 NR>1 忽略第一行,即 header 但因为它没有t 包含我们不需要的数字)。在地图中加载第一个文件后,我们将迭代第二个文件并打印出地图中的行。 NRFNR 是记住行号的 awk 变量。

您可以使用awk循环读取行号,并使用sed打印出特定行:

while read a; do sed -n ${a}p f2.txt; done < <(awk 'NR>1{print}' f1.txt)

如果你有一个更大的文件,正如 Ed 指出的那样,性能可能是一个问题,在这种情况下你可以单独使用 awk

awk 'NR==FNR{if(NR>1)l[]=1;next}{if(l[FNR])print [=14=]}' f1.txt f2.txt

另一种方法,是使用xargs:

awk 'NR>1{print }' f1.txt | xargs -n1 -I {} sed -n {}p f2.txt

使用sed构造一个sed单行(在file1的情况下它会输出 运行 sed -n "55p;67p;" file2):

sed -n "$(sed -n '2~1{s/.* //;s/.*/&p/p}' file1)" file2

awk的好广告,唉!