繁体   English   中英

比较File中的column1与File2中的column1,输出文件2中不存在的{Column1 File1}

[英]Compare column1 in File with column1 in File2, output {Column1 File1} that does not exist in file 2

以下是我的文件1内容:

123|yid|def|
456|kks|jkl|
789|mno|vsasd|

这是我的文件2的内容

123|abc|def|
456|ghi|jkl|
789|mno|pqr|
134|rst|uvw|

我想在基于文件2的文件1中进行比较的唯一一件事是第1列。基于以上文件,输出应仅输出:

134|rst|uvw|

行对行比较不是答案,因为第2列和第3列都包含不同的内容,但是只有第1列在两个文件中包含的内容完全相同。

我该如何实现?

目前,我在代码中使用了此代码:

#sort FILEs first before comparing

sort $FILE_1 > $FILE_1_sorted
sort $FILE_2 > $FILE_2_sorted

for oid in $(cat $FILE_1_sorted |awk -F"|" '{print $1}');
do
echo "output oid $oid"

#for every oid in FILE 1, compare it with oid FILE 2 and output the difference

grep -v diff "^${oid}|" $FILE_1 $FILE_2 | grep \< | cut -d \  -f 2 > $FILE_1_tmp

您可以在Awk轻松完成此操作!

awk 'BEGIN{FS=OFS="|"}FNR==NR{unique[$1]; next}!($1 in unique)' file1 file2

Awk的工作原理是处理输入线一次一个 Awk提供了一些特殊的子句,即BEGIN{}END{} ,其中包含在文件处理之前和之后要运行的操作。

因此,在文件处理发生之前就设置了BEGIN{FS=OFS="|"}部分,并且FSOFSAwk中的特殊变量,代表输入和输出字段分隔符。 由于您提供了一个由|分隔的文件| 您需要通过设置FS="|"来解析它 也可以用|打印回来 ,因此设置OFS="|"

该命令的主要部分位于BEGIN子句之后,该部分FNR==NR用于处理命令中提供的第一个文件参数,因为FNR跟踪组合文件的行号和仅当前文件的NR文件。 因此,对于第一个文件中的每个$1 ,值将散列到称为“ unique的数组中,然后在进行下一个文件处理时,部分!($1 in unique)将把第二行中那些$1值不为散列值的行删除数组。

这是另一种使用joinsortgrep内衬

join -t"|" -j 1 -a 2 <(sort -t"|" -k1,1 file1) <(sort -t"|" -k1,1 file2) |\
   grep -E -v '.*\|.*\|.*\|.*\|'

join在这里做了两件事。 它将两个文件中的所有行与匹配的键配对,并使用-a 2选项,还打印出file2中不匹配的行。

由于join需要对输入文件进行排序,因此我们对其进行排序。

最后, grep从输出中删除所有包含三个以上字段的行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM