For loop awk脚本和for循环
我有一个数据集For loop awk脚本和for循环,for-loop,awk,For Loop,Awk,我有一个数据集t.txt: 827 819 830 826 828 752 752 694 828 728 821 701 724 708 826 842 719 713 764 783 812 820 829 696 697 849 840 803 752 774 752 728 856 693 713 792 812 706 737 751 745 我还有第二个文件t1.txt: 827 819 830 826 828 752 752 694 828 728 821 701 724 70
t.txt
:
827 819
830 826
828 752
752 694
828 728
821 701
724 708
826 842
719 713
764 783
812 820
829 696
697 849
840 803
752 774
752
728
856
693
713
792
812
706
737
751
745
我还有第二个文件t1.txt
:
827 819
830 826
828 752
752 694
828 728
821 701
724 708
826 842
719 713
764 783
812 820
829 696
697 849
840 803
752 774
752
728
856
693
713
792
812
706
737
751
745
我正试图从数据集中按顺序提取第二个文件中对应的第2列元素
我使用了:awk-F”“'$1==752{print$2}'t.txt>>t2.txt
如何使用for循环执行上述指令,并将其填充到一个文本文件中,而不是逐个执行
752的输出为694。这694应该写在不同的文本文件中。812,应该是820。694和820都应该写在同一个文本文件中。它应该解析到输入文件的末尾
我试着:
for i in `cat t1.txt` | awk -F " " '$1==$i {print $2}' t.txt >> t2.txt
这是抛出语法错误 回答这个问题的第三个版本
回答这个问题的第二个版本
对于t1.txt
中的每一行,这将检查t.txt
的第1列中是否出现相同的数字。如果是,则打印同一行第2列中的数字:
$ awk 'FNR==NR{a[$1]=$2;next} $1 in a {print a[$1]}' t.txt t1.txt
694
820
要将输出保存在文件t2.txt
中,请使用:
awk 'FNR==NR{a[$1]=$2;next} $1 in a {print a[$1]}' t.txt >t2.txt
工作原理
这将读取FNR==NR{a[$1]=2;next}
,并创建其值的数组t.txt
a
对于文件a{print a[$1]}中的$1
中的每个数字,检查该数字是否出现在数组t1.txt
中,如果出现,则打印出相应的值a
t1.txt
中读取856的行,您希望打印什么?856不出现在t.txt
中。对于728行,您希望打印什么?728确实出现在t.txt
中,但仅出现在第2列中,您的其他示例用于在第1列中进行匹配。更好的是,只需显示给定示例输入的完整输出。输入文件有1650行。然而,对于像856这样的情况,迭代可以继续到t1.txt的下一行,对856什么也不做。您的脚本也会得到第1列的值。我只需要第2列的值。如果t1.txt中的数字在第2列中。它可以省略,并继续到t1.txt中的下一个数字。所需的输出将仅为:694和820John1024 I已更改输入文件。获得的输出为:774 820,而期望输出为:694 774 820,因为有2个752John1024实例,感谢前面的回复。它可以调整为处理多个实例吗?可以调整为awk'FNR==NR{a[$1]=a[$1]=a[$1]$2 ORS}$1,在a{printf(“%s”,a[$1])}t.txt t1.txt
中。总的原则是正确的。