Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在unix中比较两个文件并合并文件1和2,其中包括匹配和不匹配的数据_Linux_Shell_Unix_Awk - Fatal编程技术网

Linux 如何在unix中比较两个文件并合并文件1和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

请让我知道如何比较2个文件,并合并匹配和不匹配的行。我已经检查了之前提供的所有答案,但没有一个符合我的要求。请查找下面的样本数据集

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列是我场景中的关键组合。。