在Unix中逐字段比较两个文件
我在Unix中有两个非常大的文件,每个文件包含5列,但有数百万行 例: 文件1: abc | def | ghk | ijk | lmn .... 文件2: abc | def | ghk | ijk | 123 ... 我的任务是比较两个大文件,找出不同的列和行。例如,输出将是: 列无行无文件1字文件2字 例: 51LMN 123 这些文件真的很大。我听说awk是在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'|
这可以用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
进行比较,报告差异。