![](/img/trans.png)
[英]Awk to get file1 column and check column1 of file2,if matches then print the corresponding value
[英]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="|"}
部分,并且FS
和OFS
是Awk
中的特殊变量,代表输入和输出字段分隔符。 由于您提供了一个由|
分隔的文件|
您需要通过设置FS="|"
来解析它 也可以用|
打印回来 ,因此设置OFS="|"
该命令的主要部分位于BEGIN
子句之后,该部分FNR==NR
用于处理命令中提供的第一个文件参数,因为FNR
跟踪组合文件的行号和仅当前文件的NR
文件。 因此,对于第一个文件中的每个$1
,值将散列到称为“ unique
的数组中,然后在进行下一个文件处理时,部分!($1 in unique)
将把第二行中那些$1
值不为散列值的行删除数组。
这是另一种使用join
, sort
和grep
内衬
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.