awk 脚本和 for 循环

Posted

技术标签:

【中文标题】awk 脚本和 for 循环【英文标题】:awk script along with for loop 【发布时间】:2015-06-16 22:22:18 【问题描述】:

我有一个数据集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

我还有第二个文件t1.txt

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 

这是抛出语法错误。

【问题讨论】:

请显示您想要的输出。比如第二个文件包含856,你要打印什么? 对于t1.txt 中读取856 的行,您要打印什么? 856 未出现在 t.txt 中。对于读取 728 的行,您要打印什么? 728 确实出现在 t.txt 中,但仅出现在第 2 列中,而您的其他示例用于在第 1 列中匹配。更好的是,只需从给定的示例输入中显示您想要的完整输出。 输入文件有 1650 行。但是,对于像 856 这样的情况,迭代可以继续到 t1.txt 的下一行,而对 856 不做任何事情。 【参考方案1】:

本题第三版答案

$ awk 'FNR==NRa[$1]=1;next; $1 in a print $2;' t1.txt t.txt
694
820
774

本问题第二版的答案

对于t1.txt 中的每一行,它会检查t.txt 的任一列中是否出现相同的数字。如果是,则打印同一行第 2 列中的数字:

$ awk 'FNR==NRa[$1]=$2;next $1 in a print a[$1]' t.txt t1.txt
694
820

要将输出保存在文件 t2.txt 中,请使用:

awk 'FNR==NRa[$1]=$2;next $1 in a print a[$1]' t.txt >t2.txt

工作原理

FNR==NRa[$1]=$2;next

这会读取t.txt 并创建一个包含其值的数组a

$1 in a print a[$1]

对于文件t1.txt 中的每个数字,它会检查该数字是否出现在数组a 中,如果出现,则打印出相应的值。

【讨论】:

您的脚本也让我获得了第 1 列的值。我只需要第 2 列的值。如果 t1.txt 中的数字在第 2 列中。可以省略并继续 t1.txt 中的下一个数字。 所需的输出仅为:694 和 820 John1024 我更改了输入文件。获得的输出是:774 820,而期望输出是:694 774 820,因为有 2 个 752 实例 John1024 感谢之前的回复。是否可以对其进行调整以处理多个实例? 可以调整为awk 'FNR == NR a[$1] = a[$1] $2 ORS $1 in a printf("%s", a[$1]) ' t.txt t1.txt。一般原则是合理的。

以上是关于awk 脚本和 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

Linux13 shell函数数组及awkawk中的数组

用于在分层目录结构中使用bash循环和AWK计算和提取结果的脚本

linux自学_shell脚本for详解

(转载)(收藏)Awk学习详细文档

Shell脚本之awk详解

12.shell脚本批量创建和删除用户