在Unix中逐字段比较两个文件

在Unix中逐字段比较两个文件,unix,awk,Unix,Awk,我在Unix中有两个非常大的文件,每个文件包含5列,但有数百万行 例: 文件1: abc | def | ghk | ijk | lmn .... 文件2: abc | def | ghk | ijk | 123 ... 我的任务是比较两个大文件,找出不同的列和行。例如,输出将是: 列无行无文件1字文件2字 例: 51LMN 123 这些文件真的很大。我听说awk是在Unix中进行文件解析的最快方法。因为输出不能等待太久 这可以用awk来完成吗 粘贴/awk解决方案 $ paste -d'|

我在Unix中有两个非常大的文件,每个文件包含5列,但有数百万行

例:

文件1: abc | def | ghk | ijk | lmn ....

文件2: abc | def | ghk | ijk | 123 ...

我的任务是比较两个大文件,找出不同的列和行。例如,输出将是: 列无行无文件1字文件2字

例:

51LMN 123

这些文件真的很大。我听说awk是在Unix中进行文件解析的最快方法。因为输出不能等待太久


这可以用awk来完成吗

粘贴/awk
解决方案

$ paste -d'|' file1 file2 | 
  awk -F'|' '{w=NF/2; 
              for(i=1;i<=w;i++) 
                 if($i!=$(i+w)) printf "%d %d %s %s", NR,i,$i,$(i+w); 
              print ""}'

1 5 lmn 123
$paste-d'|'file1 file2|
awk-F'|''{w=NF/2;

对于(i=1;i
粘贴/awk
解决方案

$ paste -d'|' file1 file2 | 
  awk -F'|' '{w=NF/2; 
              for(i=1;i<=w;i++) 
                 if($i!=$(i+w)) printf "%d %d %s %s", NR,i,$i,$(i+w); 
              print ""}'

1 5 lmn 123
$paste-d'|'file1 file2|
awk-F'|''{w=NF/2;

对于(i=1;iYes,可以用
awk
来完成-虽然同时读取两个文件很困难,但是保存一个文件中的所有输入,然后在读取第二个文件时使用它是
awk
脚本的正常操作模式。您尝试了什么,在哪里遇到了问题?如果您可以使用Perl或Python,您会发现它更容易避免将一个文件的整个文件拖到内存中。即使我使用Perl,我至少也必须在内存中拖一个文件,对吗?然后使用该数据结构来比较第二个文件否;使用Perl,您可以从文件1中读取一行,从文件2中读取一行,然后比较这些行,并打印差异;冲洗并重复。@JonathanLeffler显然,您也可以在awk中使用
getline
对从file1中读取的每一行执行此操作。当然,我不是说这是最好的方法,只是说它是可行的。Subhayan-编辑您的问题,以包括简明的、可测试的示例输入(例如,两个文件,每行4或5行,每列4或5列)和预期输出。是的,可以使用
awk
完成-虽然同时读取两个文件很困难,但保存一个文件中的所有输入,然后在读取第二个文件时使用它是
awk
脚本的正常操作模式。您尝试了什么,在哪里遇到问题?如果您可以使用Perl或Python,您会发现避免将一个文件的整个文件都拖到内存中更容易。即使我使用Perl,我至少也要在内存中拖一个文件,对吗?然后使用该数据结构来比较第二个文件否;使用Perl,您将从文件1中读取一行,从文件2中读取一行,然后比较这些行,并打印差异;冲洗并重复t、 @JonathanLeffler显然,在awk中,你也可以用
getline
对从file1中读取的每一行执行此操作。我当然不是说这是最好的方法,只是说这是可以做到的。Subhayan-编辑你的问题,以包含简明、可测试的样本输入(例如,一对4或5行、4或5列的文件)和预期输出。我对awk不太精通。你能解释一下这是怎么做到的吗?即使是在非常大的负载情况下,这个过程也能有效地工作files@SubhayanBhattacharya:使用
paste
命令将文件1中第1行的副本与文件2中第1行的副本放在同一行上,并用
|
(因为
-d'|'
)。然后,
awk
命令通过字段进行操作,在必要时进行比较和打印。如果
file1
中有5个字段,则输入行中有10个字段;
w
=5;它将
$1与
$6
进行比较,
$2`与
$7
进行比较,报告差异。我对awk不太精通。您能解释一下吗这是如何做到的?而且,即使在非常大的故障情况下,该过程也能有效地工作files@SubhayanBhattacharya:粘贴
命令将文件1中第1行的副本与文件2中第1行的副本放在同一行上,并用
|
分隔(因为
-d'|'
)。然后,
awk
命令通过字段进行操作,必要时进行比较和打印。如果
file1
中有5个字段,则输入行中有10个字段;
w
=5;它将
$1与
$6
进行比较,
$2`与
$7
进行比较,报告差异。