打印 "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 包含我们不需要的数字)。在地图中加载第一个文件后,我们将迭代第二个文件并打印出地图中的行。 NR
和 FNR
是记住行号的 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的好广告,唉!
文件 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 包含我们不需要的数字)。在地图中加载第一个文件后,我们将迭代第二个文件并打印出地图中的行。 NR
和 FNR
是记住行号的 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的好广告,唉!