如何比较两个列表的第一个单词并打印匹配条目的第二个单词?

时间:2014-11-29 21:46:21

标签: linux bash shell unix

您好作为示例我有以下文件:

file1
aa1
aa2
aa3
aa4
aa5
aa6
aa7
aa8
aa9
aa10

file2
aa1 1.1.1.1
aa2 1.1.1.2
aa4 1.1.1.4
aa6 1.1.1.6
aa11 1.1.1.11
aa8 1.1.1.8

我需要保留file1的所有行,但是要打印匹配行的IP。类似的东西:

file3
aa1 1.1.1.1
aa2 1.1.1.2
aa3
aa4 1.1.1.4
aa5
aa6 1.1.1.6
aa7
aa8 1.1.1.8
aa9
aa10

我试图使用两个for循环和awk来做一些脚本,但它没有按预期工作。

4 个答案:

答案 0 :(得分:1)

使用标准join命令:

$ join -a 1 file1 file2
aa1 1.1.1.1
aa2 1.1.1.2
aa3
aa4 1.1.1.4
aa5
aa6 1.1.1.6
aa7
aa8 1.1.1.8
aa9
aa10

此工具将两个文件连接在一起共享"键"柱。 -a 1保留文件1中所有未配对的行。

答案 1 :(得分:1)

由于您的原始输入文件实际上没有按字典顺序排序,因此您无法在大多数Unix工具所假设的单一线性传递中执行您想要的操作,但只要您不这样做,这将产生类似的输出。 ; t需要保留原始输入顺序:

$ join -a1 <(sort file1) <(sort file2)
aa1 1.1.1.1
aa10
aa2 1.1.1.2
aa3
aa4 1.1.1.4
aa5
aa6 1.1.1.6
aa7
aa8 1.1.1.8
aa9

这是一个使用Perl的解决方案,它通过将所有数据存储在内存中并使用哈希来执行查找来保留原始行顺序:

$ perl -n -e 'BEGIN { open my $f, "<", "file2"; %m = map { chomp; split } <$f> } chomp; print "$_ $m{$_}\n";' file1
aa1 1.1.1.1
aa2 1.1.1.2
aa3 
aa4 1.1.1.4
aa5 
aa6 1.1.1.6
aa7 
aa8 1.1.1.8
aa9 
aa10 

答案 2 :(得分:1)

使用awk的解决方案是

$ awk 'FNR==NR{line[$0]=""; next} ($1 in line){line[$1]=$2} END{for ( i in line) print i, line[i]}' file1 file2 | sort -n
aa10 
aa1 1.1.1.1
aa2 1.1.1.2
aa3 
aa4 1.1.1.4
aa5 
aa6 1.1.1.6
aa7 
aa8 1.1.1.8
aa9 

答案 3 :(得分:0)

循环浏览file1以及要求从文件2执行grep的每个单词怎么样?如果找到打印grep输出其他打印来自file1的单词?