如何比较两个文件并检查 fileA 中的内容是否出现在 fileB 中并仅显示数字?

如何比较两个文件并检查 fileA 中的内容是否出现在 fileB 中并仅显示数字?

我尝试在谷歌和网站上搜索类似的问题,但我找不到我要找的东西。我有 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

相关内容