【问题标题】:Characters comparison between two files两个文件之间的字符比较
【发布时间】:2020-06-25 20:51:45
【问题描述】:

假设我们有 2 个列格式的 txt 文件(空格是分隔符)。 第一个文件:

Col1 Col2  Col3
1    1     1
Two  2     2
3    3     3
4    4     4

第二个:

Col1 Col2  Col3
1    1     One
2    2     2
Test 3     Test
4    4     4

我们比较一下:

  • 第 1 行。Col3 中的值不同

  • 第 2 行。Col1 中的值不同

  • 第 3 行。Col1、Col3 中的值不同

  • 第 4 行。值相等

问题是如何获取所有不同列的列表(在这种特殊情况下为 Col1 和 Col3)。 我想知道是否可以仅使用 diff 之类的 Linux 工具进行访问?

我找到了一个 wdiff 工具,用于逐字比较文件。但我不知道如何使用它来解决我的任务。

wdiff 文件1.txt 文件2.txt

1    1 [-1
Two-]     {+One+}
2    2     {+2
Test+} 3 [-3 3-]     {+Test+}
4    4     4

【问题讨论】:

  • @GillesQuenot 是的,我尝试使用 wdiff 工具
  • @GillesQuenot 抱歉,已修复

标签: linux file comparison diff


【解决方案1】:

Perl 来救援!

paste file1 file2 \
| perl -lane '
    @cols = @F if 1 == $.;
    $F[$_] eq $F[$_ + @F/2] or ++$h{$_} for 0 .. $#F/2;
    END {print "@cols[keys %h]"}'

paste 并排打印文件:

1    1     1    1    1     One
Two  2     2    2    2     2
3    3     3    Test 3     Test
4    4     4    4    4     4

Perl 然后读取这些行,将第一列与第四列进行比较,依此类推,并记住哪些列不同。最后,它会显示有差异的列的名称。

  • -l 从输出中删除换行符,将它们添加到 print
  • -n 为每一行输入运行代码
  • -a 将空格上的输入拆分到 @F 数组中
  • $. 是输入行号。第一行填充列名数组@cols。
  • $#F 是数组 @F 的最后一个索引。因此,我们将 @F 的索引从 0 遍历到一半,并为每个列比较列,如果它们不同,我们将列的索引存储在 %h 哈希中。
  • END 在最后运行。 keys 返回不同列的索引,因此我们将它们映射到存储在 @cols 数组中的名称。

【讨论】:

  • 谢谢,伙计!不幸的是,我不使用 Perl,但它将来可能对我有用。
【解决方案2】:

有点冗长和冗长...

awk '
FNR==1 || !NF {next}
FNR==NR{
  for(i=1;i<=NF;i++)
     f1[FNR,i]=$i
  next
}
{
  for(i=1;i<=NF;i++)
    if ($i != f1[FNR,i])
     diff[i]
}
END {
  for (i in diff)
    print i
}
' file1 file2

类似于@choroba 的 perl 方法:

paste file1 file2 | \
   awk '
     {
         for(i=1;i<=NF/2;i++)
           if ($i != $(i+NF/2) )
             diff[i]
     }
     END {
       for (i in diff)
         print i
     }
   '

【讨论】:

  • 哇,非常感谢!关于“FNR”和“NF”缩写的问题。这是什么意思?
  • 还有“NR”
  • NF:当前输入记录的字段数; FNR:当前输入文件中的输入记录号; NR:到目前为止看到的输入记录总数。第一个要解析的文件的 FNR==NR。
  • 顺便说一句,即使文件相等,带有“粘贴”的第二个脚本也会导致错误的最后行号打印。但它的工作速度更快。
  • 不适用于您提供的示例文件。得到输出的是字段编号 - 而不是具有差异值的行/记录编号。愿意分享您的错误文件吗?注意:它假设矩阵/表格的维度是相同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2014-05-31
相关资源
最近更新 更多