【问题标题】:Comparing two files field by field in Linux在 Linux 中逐字段比较两个文件
【发布时间】:2012-06-15 13:29:18
【问题描述】:

我正在尝试使用 3 个字段(file1 中的字段 1,2,5 和 file2 中的 1,2,5)比较两个文件(用逗号和空格分隔),如果这两个文件匹配我想要 file2 的整个记录使用 awk 与 file1 的最后一个字段连接。例如 文件1:

1, 4, abebe, kebede, 25, 101, 42
1, 4, abebe, debebe, 42, 201, 47
1, 4, abebech, kebede, 17, 33, 57

文件2:

1, 4, abebe, kebede, 25, 101, 42
1, 4, Tesse, debo, 25, 101, 42
1, 4, derartu, tulu, 25, 101, 42

输出:

42, 1, 4, abebe, kebede, 25, 101, 42
47, 1, 4, Tesse, debo, 25, 101, 42
57, 1, 4, derartu, tulu, 25, 101, 42

我是 linux 新手.... 任何帮助都可以得到帮助

【问题讨论】:

  • 文件为 file1: 1, 4, abebe, kebede, 25, 101, 42 (rec1) 1, 4, abebe, debebe, 42, 201, 47(rec2) 1, 4, abech , kebede, 17, 33, 42 (rec3) file2: 1, 4, abebe, kebede, 25, 101, 42 (rec1) 1, 4, Tesse, debo, 25, 101, 42(rec2) 1, 4, derartu , 图卢, 25, 101, 42(rec3)
  • 文件 1 中记录 1 的字段 1、2 和 5 匹配文件 2 中的所有记录。
  • 您的输出与问题描述不符。文件 2 中的所有记录都与文件 1 中第一条记录的字段 1、4、25 匹配,因此输出的所有行都应以 42 开头。您真的关心字段 4 而不是字段 5?

标签: linux awk


【解决方案1】:

我对这个问题的第一次阅读很适合这个解决方案:

awk '{getline t < "file2"; split( t, a );
    if( a[1]a[2]a[5] == $1$2$5) print $NF",", t}' file1

但问题似乎实际上是:'给定file1,我们知道其中字段 1、2 和 4 相同的任何记录最终字段也相同,找到 @987654323 中的所有行@ 与相应的字段 1、2 和 4 并输出该行,并在前面加上 file1 的最后一个字段。在这种情况下,丹尼斯给出的解决方案有效。

【讨论】:

  • 那一行用于行比较,但是 OP 没有指定两个文件中的行是否对应,或者一个文件是否比另一个文件多。
  • @Dennis,确实,问题说明很模糊。
  • 文件中的记录数不同
  • 这非常适合逐行比较。但是如果我想在第二个文件中搜索第一个文件的每条记录并在匹配时打印出来呢?
【解决方案2】:

由于文件 1 中记录 1 的字段 1、2 和 5 匹配 所有 文件 2 中的记录,我已将文件作为参数以相反的顺序列出,以便获得您想要的输出。

awk 'BEGIN {OFS = ", "} NR == FNR {a[$1, $2, $5] = $NF; next} $1 SUBSEP $2 SUBSEP $5 in a {print a[$1, $2, $5], $0}' file2 file1

NR == FNR 块形成一个循环,将出现在参数列表中的第一个文件读入一个数组。当记录号(NR)和文件记录号(FNR)不再相等时,继续处理被命名为第二个参数的文件。

在那里,检查数组以查看两个文件中的字段是否匹配。如果是,则输出对应的已保存字段和当前记录。

【讨论】:

  • 我需要程序逐行比较。来自 file1 的第一行与来自 file2 的相应行。两个文件的记录数不同
  • 如果文件的行数不同,“对应行”是什么意思?
  • @WilliamPursell:具有$1 SUBSEP $2 SUBSEP $5 in a 的行。换言之,字段 1、2 和 5 在两个文件之间匹配,而与每个文件中的记录数无关。它们的相对或绝对顺序并不重要(它们未排序)。
  • @WilliamPurse:它将从两个文件中逐行读取并比较这两行
  • @TesseM:不过,它不会同步读取这两个文件。它读取一个文件的所有内容,然后读取另一个文件。
猜你喜欢
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2021-04-27
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多