gpt4 book ai didi

awk 根据共同字段合并两个文件并打印异同

转载 作者:行者123 更新时间:2023-12-04 06:39:11 26 4
gpt4 key购买 nike

我有两个文件我想合并到第三个文件中,但我需要查看它们何时共享一个公共(public)字段以及它们的不同之处。由于其他字段存在细微差异,我无法使用差异工具,我认为这可能是用awk完成。

文件 1:

aWonderfulMachine             1   mlqsjflk          
AnotherWonderfulMachine 2 mlksjf
YetAnother WonderfulMachine 3 sdg
TrashWeWon'tBuy 4 jhfgjh
MoreTrash 5 qsfqf
MiscelleneousStuff 6 qfsdf
MoreMiscelleneousStuff 7 qsfwsf

文件2:
aWonderfulMachine             22    dfhdhg          
aWonderfulMachine 23 dfhh
aWonderfulMachine 24 qdgfqf
AnotherWonderfulMachine 25 qsfsq
AnotherWonderfulMachine 26 qfwdsf
MoreDifferentStuff 27 qsfsdf
StrangeStuffBought 28 qsfsdf

期望的输出:
aWonderfulMachine   1   mlqsjflk    aWonderfulMachine   22  dfhdhg
aWonderfulMachine 23 dfhdhg
aWonderfulMachine 24 dfhh
AnotherWonderfulMachine 2 mlksjf AnotherWonderfulMachine 25 qfwdsf
AnotherWonderfulMachine 26 qfwdsf
File1
YetAnother WonderfulMachine 3 sdg
TrashWeWon'tBuy 4 jhfgjh
MoreTrash 5 qsfqf
MiscelleneousStuff 6 qfsdf
MoreMiscelleneousStuff 7 qsfwsf
File2
MoreDifferentStuff 27 qsfsdf
StrangeStuffBought 28 qsfsdf

我在这里和那里尝试了一些 awks 脚本,但它们要么仅基于两个字段,而且我不知道如何修改输出,或者它们仅基于两个字段删除重复项,等等(我是新手这和 awk 语法很难)。
非常感谢您的帮助。

最佳答案

您可以使用以下三个命令非常接近:

join <(sort file1) <(sort file2)
join -v 1 <(sort file1) <(sort file2)
join -v 2 <(sort file1) <(sort file2)

这假设一个 shell,例如 Bash,支持进程替换 ( <())。如果您使用不支持的外壳,则需要对文件进行预排序。

要在 AWK 中执行此操作:
#!/usr/bin/awk -f
BEGIN { FS="\t"; flag=1; file1=ARGV[1]; file2=ARGV[2] }
FNR == NR { lines1[$1] = $0; count1[$1]++; next } # process the first file
{ # process the second file and do output
lines2[$1] = $0;
count2[$1]++;
if ($1 != prev) { flag = 1 };
if (count1[$1]) {
if (flag) printf "%s ", lines1[$1];
else printf "\t\t\t\t\t"
flag = 0;
printf "\t%s\n", $0
}
prev = $1
}
END { # output lines that are unique to one file or the other
print "File 1: " file1
for (i in lines1) if (! (i in lines2)) print lines1[i]
print "File 2: " file2
for (i in lines2) if (! (i in lines1)) print lines2[i]
}

要运行它:
$ ./script.awk file1 file2

这些行不会按照它们在输入文件中出现的顺序输出。第二个输入文件 (file2) 需要排序,因为脚本假定相似的行是相邻的。您可能需要调整脚本中的制表符或其他间距。我在这方面做的不多。

关于awk 根据共同字段合并两个文件并打印异同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com