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

时间:2016-04-26 17:36:34

标签: shell unix awk gawk

File1中:

count    line_num  
xy       55  
ab       67 

文件2:

a|b|c  
d|e|f  

我想打印55,67行文件2

我正在尝试:

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

但它没有用!

3 个答案:

答案 0 :(得分:4)

使用awk 'NR==FNR{line[$2]; next} FNR in line' file1 file2 即可:

line

我们迭代第一个文件并将第二列存储在名为NR>1的地图中(我们可以通过执行NR忽略第一行作为标题,但由于它不包含数字,我们不会我需要)。在地图中加载第一个文件后,我们迭代第二个文件并打印出地图中的行。 FNR和{{1}}是记住行号的awk变量。

答案 1 :(得分:1)

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

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

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

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

另一种方法是使用xargs

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

答案 2 :(得分:0)

使用 sed 构建 sed 单行(在 file1 的情况下,输出并运行{{1} }}):

sed -n "55p;67p;" file2

awk 的好广告,唉!