我有两个文件 f1.txt 和 f2.txt。我需要比较这两个文件并打印匹配的列以及打印具有“未找到”模式的不匹配的列。
f1:
hari:1.2.3.4/32
abc:3.4.5.6/24
bcd:8.9.10.11/34
f2:
1.2.3.4/32
3.4.5.6/24
8.9.10.11/34
10.12.34.0/22
1.4.5.7/34
期望输出:
hari:1.2.3.4/32
abc:3.4.5.6/24
bcd:8.9.10.11/34
not found:10.12.34.0/22
not found:1.4.5.7/34
有人可以帮忙获取所需的输出吗?
谢谢
答案1
您可以使用 awk:
$ awk -F':' -vOFS=':' 'NR==FNR{a[$2]=$1;next}{print $1 in a?a[$1]:"not found",$1}' file1 file2
hari:1.2.3.4/32
abc:3.4.5.6/24
bcd:8.9.10.11/34
not found:10.12.34.0/22
not found:1.4.5.7/34
采用更易读的格式:
awk -F':' -vOFS=':' 'NR == FNR { # For the first file (file1)
a[$2] = $1 # store the first token in an array
# using the second token as the key
next # skip to the next record
}
{ # For all lines of file 2
print $1 in a ? a[$1] : "not found" , $1 # print the desired result
}' file1 file2
答案2
尽管您的f2
操作似乎没有严格排序,但join
似乎可以正常工作:
$ join -t\: -12 -21 -a2 -e 'not found' -o1.1,0 f1 f2
hari:1.2.3.4/32
abc:3.4.5.6/24
bcd:8.9.10.11/34
not found:10.12.34.0/22
not found:1.4.5.7/34
对于真实数据,你可能需要进行预先排序:
$ join -t\: -12 -21 -a2 -e 'not found' -o1.1,0 <(sort -t\: -k2,2 f1) <(sort -t\: -k1,1 f2) | sort
abc:3.4.5.6/24
bcd:8.9.10.11/34
hari:1.2.3.4/32
not found:10.12.34.0/22
not found:1.4.5.7/34
1也许是因为可匹配行已排序?