比较在linux

问题描述:

2个CSV文件,我在下面的格式与我两个CSV文件:比较在linux

文件1:

No.1, No.2 
983264,72342349 
763498,81243970 
736493,83740940 

文件2:

No.1,No.2 
"7938493","7364987" 
"2153187","7387910" 
"736493","83740940" 

我需要比较两个文件并输出匹配的,不匹配的值。 我做到了通过AWK:

#!/bin/bash 

awk 'BEGIN { 
    FS = OFS = "," 
} 
if (FNR==1){next} 
NR>1 && NR==FNR { 
    a[$1]; 
    next 
} 
FNR>1 { 
    print ($1 in a) ? $1 FS "Match" : $1 FS "In file2 but not in file1" 
    delete a[$1] 
} 
END { 
    for (x in a) { 
     print x FS "In file1 but not in file2" 
    } 
}'file1 file2 

但输出是:

"7938493",In file2 but not in file1 
"2153187",In file2 but not in file1 
"8172470",In file2 but not in file1 
7938493,In file1 but not in file2 
2153187,In file1 but not in file2 
8172470,In file1 but not in file2 

能否请你告诉我,我错了?

+1

由于您有语法错误:'a [$ 1};',这不能成为您的实际脚本。您发布的输入的期望输出是什么? – 2015-02-11 16:53:16

+0

这只是错误发生。 我想要的输出是用脚本中的注释和文件1中的值来打印公共值,但不是在文件2中打印它们的值,反之亦然。但是在两种情况下都会打印这些值。 – 2015-02-11 16:57:45

这里有一些修正你的脚本:

BEGIN { 
    # FS = OFS = "," 
    FS = "[,\"]+" 
    OFS = ", " 
} 
# if (FNR==1){next} 
FNR == 1 {next} 

# NR>1 && NR==FNR { 
NR==FNR { 
    a[$1]; 
    next 
} 
# FNR>1 { 
$2 in a { 
    # print ($1 in a) ? $1 FS "Match" : $1 FS "In file2 but not in file1" 
    print ($2 in a) ? $2 OFS "Match" : $2 "In file2 but not in file1" 
    delete a[$2] 
} 
END { 
    for (x in a) { 
     print x, "In file1 but not in file2" 
    } 
} 

这是一个awk脚本,这样你就可以像awk -f script.awk file1 file2运行它。这么做让这些结果:

$ awk -f script.awk file1 file2 
736493, Match 
763498, In file1 but not in file2 
983264, In file1 but not in file2 

与脚本的主要问题是,它没有正确地处理周围的号码双引号file2。我更改了输入字段分隔符,以便将双引号作为分隔符的一部分处理。因此,第二个文件中的第一个字段$1是空的(它是行首和第一个"之间的位),因此您需要使用$2来引用您感兴趣的第一个值。Aside从此,我从您的其他区块中删除了一些冗余条件,并在您的第一条print声明中使用了OFS而不是FS

+0

非常感谢。有效。 – 2015-02-12 05:27:21

+0

@UDITA我很高兴听到这个消息。如果您的问题已解决,请不要忘记将我的答案标记为已接受,方法是单击旁边的刻度线。 – 2015-02-12 09:30:12