我尝试在谷歌和网站上搜索类似的问题,但我找不到我要找的东西。我有 2 个文件,两个文件都只填充了数字。我想知道如何将 FileB 与 FileA 中的行进行比较,如果 FileB 中的行不在 FileA 中,则只需忽略它。比较后,我只想打印 FileA 中的特定数据。为了进一步解释两者都已经按数字排序:
文件A:
103445 -630
103572 -638
107586 -133
109754 -466
111900 -643
112699 -371
112991 -17
113863 -175
114189 -691
文件B:
101191 1136
103184 1322
103445 -210
103572 1424
104618 28
105395 1052
正如你所看到的,B 中的第 1-2 行不在 A 中,所以我完全忽略它们。我只想保存 B 中 A 中前 6 个字符的行。然后我还有一些其他命令要运行,但我想我知道如何执行这些操作,只需要挤出相关数据即可。
我尝试使用 Comm,但它并没有真正提供我正在寻找的解决方案......
编辑:我还必须保留其他列数据,因为我的下一步是检查 col2 中的值是否等于或大于 FileB (abs val) 上相应值的一半。我想最后只保留那些。例如,在执行所有命令后,我需要它仅打印 FileA 中符合这些条件的 col1 数据。在上面的当前示例中,不会打印任何内容,但在我的较大文件中,将打印包含 1000 行内容的内容。
答案1
$ join FileA FileB | awk '{ x = $2; y = $3 } y < 0 { y = -y } x >= y/2 { print $1, $2 }'
给定示例数据,join
将导致
103445 -630 -210
103572 -638 1424
其中第一列是联接字段,第二列是 from FileA
,最后一列是 from FileB
。此步骤依赖于对两个文件进行排序。
然后,代码awk
将从最后两列中挑选出值作为 和 ,x
如果为负数则y
取反。y
如果x >= y/2
输出前两列(这些来自FileA
)。
该awk
位可以缩短为
awk '$3 < 0 { $3 = -$3 } $2 >= $3/2 { print $1, $2 }'
但$3
如果您稍后决定输出此值或 ,则这会修改可能不需要的内容$0
。