如何在与linux比较文件时显示行号;“通信”;工具

如何在与linux比较文件时显示行号;“通信”;工具,linux,command-line,diff,comm,Linux,Command Line,Diff,Comm,我想使用linux命令行工具区分两个非常大的文件(多GB),并查看差异的行号。数据的顺序很重要 我在Linux机器上运行,标准的diff工具给了我“内存耗尽”错误-H不起作用 在我的应用程序中,我只需要流式传输diff结果。也就是说,我只想直观地查看前几个差异,我不需要检查整个文件。如果有差异,快速看一眼就会告诉我出了什么问题 “comm”似乎很适合这种情况,但它不显示差异的行号 一般来说,我的多GB文件只有几百行不同的行,文件的其余部分是相同的 有没有办法让comm转储行号?还是一种使diff

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

我在Linux机器上运行,标准的diff工具给了我“内存耗尽”错误-H不起作用

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

“comm”似乎很适合这种情况,但它不显示差异的行号

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


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

我不会使用
comm
,但正如您所说的,除了您认为应该如何做之外,我将重点放在“您需要什么”上:

一种有趣的方法是使用
paste
awk
paste
可以使用分隔符“并排”显示两个文件。如果使用
\n
作为分隔符,它将显示2个文件,每个文件的第1行,然后是每个文件的第2行等

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

(相互关联的是,此解决方案将允许轻松扩展,以便在一次读取中对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)

我不会使用
comm
,但正如您所说的,除了您认为应该如何做之外,我将重点放在“您需要什么”上:

一种有趣的方法是使用
paste
awk
paste
可以使用分隔符“并排”显示两个文件。如果使用
\n
作为分隔符,它将显示2个文件,每个文件的第1行,然后是每个文件的第2行等

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

(相互关联的是,此解决方案将允许轻松扩展,以便在一次读取中对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)

您尝试过哪些版本的差异?GNU diff有一个“-speed large files”,这可能会有所帮助


comm工具假定行已排序。

您尝试过哪些版本的diff?GNU diff有一个“-speed large files”,这可能会有所帮助


comm工具假定行已排序。

太棒了!我把它做成了一个bash脚本,放在我的路径中,很高兴它起到了作用。你的问题迫使我寻找一个解决方案,我现在也将大量使用这个解决方案(以一种有效的方式区分多gb文件是相互测试)。这是我第一次使用“粘贴”^^太棒了!我把它做成了一个bash脚本,放在我的路径中,很高兴它起到了作用。你的问题迫使我寻找一个解决方案,我现在也将大量使用这个解决方案(以一种有效的方式区分多gb文件是相互测试)。这是我第一次使用“粘贴”^^我尝试了速度不同的大文件,但实际上并不能解决内存耗尽的问题。diff-h也没有,我尝试了diff-speed大文件,但这实际上并不能解决内存耗尽的问题。diff-h也没有。