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
但它没有用!
答案 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 的好广告,唉!