linux - linux "comm"工具比较文件时如何显示行号

标签 linux command-line diff comm

我想比较两个非常大的文件(多 GB),使用 linux 命令行工具,并查看差异的行号。数据的顺序很重要。

我在 Linux 机器上运行,标准 diff 工具给我“内存耗尽”错误。 -H 没有影响。

在我的应用程序中,我只需要流式传输差异结果。也就是说,我只想直观地查看前几个差异,不需要检查整个文件。如果存在差异,快速浏览一下就会告诉我哪里出了问题。

'comm' 似乎很适合这个,但它不显示差异的行号。

一般来说,我的多 GB 文件只有几百行不同,文件的其余部分是相同的。

有没有办法让 comm 转储行号?还是一种使差异运行而不将整个文件加载到内存中的方法? (比如将输入文件切割成 1k block ,而不是在我的文件系统中实际创建一百万个 1k 文件并将所有内容弄乱)?

最佳答案

我不会使用 comm,但是正如您所说的,除了您认为应该如何做之外,我将专注于“您需要什么”:

一个有趣的方法是使用 pasteawk :paste 可以使用分隔符“并排”显示 2 个文件。如果您使用 \n 作为分隔符,它会显示 2 个文件,每个文件的第 1 行,然后是每个文件的第 2 行,依此类推。

因此您可以使用的脚本很简单(一旦您知道每个文件中的行数相同):

 paste -d '\n' /tmp/file1  /tmp/file2 | awk '
        NR%2  { linefirstfile=$0 ; } 
      !(NR%2) { if ( $0 != linefirstfile )
                      { print "line",NR/2,": "; print linefirstfile ; print $0 ; } }'

(有趣的是,这个解决方案将允许很容易地扩展到在一次读取中对 N 个文件进行比较,无论 N 个文件的大小是多少......只需在执行之前添加一个检查是否所有文件都具有相同的行数比较步骤(否则“粘贴”最终将仅显示较大文件中的行))

这是一个(简短的)示例,展示它是如何工作的:

$ cat > /tmp/file1
A
C %FORGOT% fmsdflmdflskdf dfldksdlfkdlfkdlkf
E

$ cat > /tmp/file2
A
C sdflmsdflmsdfsklmdfksdmfksd fmsdflmdflskdf dfldksdlfkdlfkdlkf
E

$ paste -d '\n' /tmp/file1 /tmp/file2
A
A
C %FORGOT% fmsdflmdflskdf dfldksdlfkdlfkdlkf
C sdflmsdflmsdfsklmdfksdmfksd fmsdflmdflskdf dfldksdlfkdlfkdlkf
E
E

$ paste -d '\n' /tmp/file1 /tmp/file2 | awk '
     NR%2  { linefirstfile=$0 ; }
   !(NR%2) { if ( $0 != linefirstfile ) 
               { print "line",NR/2,": "; print linefirstfile ; print $0 ; } }'
line 2 :
C %FORGOT% fmsdflmdflskdf dfldksdlfkdlfkdlkf
C sdflmsdflmsdfsklmdfksdmfksd fmsdflmdflskdf dfldksdlfkdlfkdlkf

如果碰巧文件没有相同数量的行,那么你可以先添加一个行数检查,比较 $(wc -l/tmp/file1)$(wc -l/tmp/file2) ,并且只做过去...|awk 如果他们有相同数量的行,以确保“粘贴”通过始终有一个正确地工作每行! (当然,在那种情况下,每个文件都会(快速!)完整读取...)

您可以轻松调整它以完全按照您的需要显示。你可以在第 N 个差异后退出(自动,在 awk 循环中使用计数器,或者当你看到足够多时按 CTRL-C)

关于linux - linux "comm"工具比较文件时如何显示行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16305159/

相关文章:

ssh - 除了将远程文件与本地文件进行比较之外

diff - Javers:比较两个json时忽略值对象中的特定字段

linux - 在 RedHat Linux 脚本中使用 cd

linux - 如何在shell变量中执行sh命令集?

linux - Vala gstreamer 链接失败

java - 有没有办法通过 LAN 以编程方式/命令行从 windows/linux 挂载 android 目录?

mysql - 将结果从 MySQL 过程传递到 Linux 命令行

python - Linux在OpenWrt中如何新建文件/脚本

command-line - 如何更改 FAR 中文本的颜色?

linux - 用于 Linux 的 Visual SVN 差异和比较工具