Linux 如何在unix中比较两个文件并合并文件1和2,其中包括匹配和不匹配的数据
请让我知道如何比较2个文件,并合并匹配和不匹配的行。我已经检查了之前提供的所有答案,但没有一个符合我的要求。请查找下面的样本数据集Linux 如何在unix中比较两个文件并合并文件1和2,其中包括匹配和不匹配的数据,linux,shell,unix,awk,Linux,Shell,Unix,Awk,请让我知道如何比较2个文件,并合并匹配和不匹配的行。我已经检查了之前提供的所有答案,但没有一个符合我的要求。请查找下面的样本数据集 file1.csv的内容: J2D TEXAS 43988 J2D AUSTIN 21305 J2D CUPERTINO 378563 J2D BELGIUM 569632 J2D UK 0 J2D US 8 J2D INDI
file1.csv的内容
:
J2D TEXAS 43988
J2D AUSTIN 21305
J2D CUPERTINO 378563
J2D BELGIUM 569632
J2D UK 0
J2D US 8
J2D INDIA 75321
J2D TEXAS 25463
J2D AUSTIN 5986
J2D CUPERTINO 0234
J2D BELGIUM 123468
J2D UK 5874
J2D US 2365
J2D IRAQ 8982
file2.csv的内容
:
J2D TEXAS 43988
J2D AUSTIN 21305
J2D CUPERTINO 378563
J2D BELGIUM 569632
J2D UK 0
J2D US 8
J2D INDIA 75321
J2D TEXAS 25463
J2D AUSTIN 5986
J2D CUPERTINO 0234
J2D BELGIUM 123468
J2D UK 5874
J2D US 2365
J2D IRAQ 8982
我尝试了以下命令,但在我的场景中它不起作用:
awk 'NR==FNR{a[$2]=$3;next;}{print $0 " " ($2 in a ? a[$2] : "NA")}' file2.csv file1.csv
输出:
J2D TEXAS 43988 25463
J2D AUSTIN 21305 5986
J2D CUPERTINO 378563 0234
J2D BELGIUM 569632 123468
J2D UK 0 5874
J2D US 8 2365
J2D INDIA 75321 NA
J2D TEXAS 25463 43988
J2D AUSTIN 5986 21305
J2D CUPERTINO 0234 378563
J2D BELGIUM 123468 569632
J2D UK 5874 0
J2D US 2365 8
J2D IRAQ 8982 NA
在上面的结果中,您可以从file2.csv
中看到“伊拉克”
awk 'NR==FNR{a[$2]=$3;next;}{print $0 " " ($2 in a ? a[$2] : "NA")}' file1.csv file2.csv
输出:
J2D TEXAS 43988 25463
J2D AUSTIN 21305 5986
J2D CUPERTINO 378563 0234
J2D BELGIUM 569632 123468
J2D UK 0 5874
J2D US 8 2365
J2D INDIA 75321 NA
J2D TEXAS 25463 43988
J2D AUSTIN 5986 21305
J2D CUPERTINO 0234 378563
J2D BELGIUM 123468 569632
J2D UK 5874 0
J2D US 2365 8
J2D IRAQ 8982 NA
在上面的结果中,您可以从file1中看到“INDIA”。缺少csv
以下是预期产出。请帮助我获得所需的输出
预期产出:
J2D TEXAS 43988 25463
J2D AUSTIN 21305 5986
J2D CUPERTINO 378563 0234
J2D BELGIUM 569632 123468
J2D UK 0 5874
J2D US 8 2365
J2D INDIA 75321 NA
J2D IRAQ NA 8982
粘贴+awk解决方案:
paste file1.csv file2.csv | awk '{ if($2==$5) { print $1,$2,$3,$6 }
else { print $1,$2,$3,"NA","\n",$4,$5,"NA",$6 }}' | column -tx
输出:
J2D TEXAS 43988 25463
J2D AUSTIN 21305 5986
J2D CUPERTINO 378563 0234
J2D BELGIUM 569632 123468
J2D UK 0 5874
J2D US 8 2365
J2D INDIA 75321 NA
J2D IRAQ NA 8982
详细信息:
-合并文件行粘贴文件1.csv文件2.csv
-如果文件与第二列匹配(if($2==$5){print$1,$2,$3,$6}
字段指向$5
file2.csv的第二列)
-将未标记的行打印为单独的行,相对位置为打印$1、$2、$3、“NA”、“\n”、$4、$5、“NA”、$6
NA
awk
救援
$ awk '{k=$1 FS $2}
NR==FNR {a[k]=$3; next}
{print $0, (k in a)?a[k]:"NA"; delete a[k]}
END {for(k in a) print k,"NA",a[k]}' file2 file1 | column -t
J2D TEXAS 43988 25463
J2D AUSTIN 21305 5986
J2D CUPERTINO 378563 0234
J2D BELGIUM 569632 123468
J2D UK 0 5874
J2D US 8 2365
J2D INDIA 75321 NA
J2D IRAQ NA 8982
首先设置你的问题的格式,使其易于阅读嗨,罗曼,我已经设置了问题的格式。请在这方面帮助我,如果输出按第二个字段排序,对您是否合适?是的,排序很好…还有一件事,前2列是我场景中的关键组合。。