打印符合模式的匹配列和不匹配列

打印符合模式的匹配列和不匹配列

我有两个文件 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也许是因为可匹配行已排序?

相关内容