您好作为示例我有以下文件:
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来做一些脚本,但它没有按预期工作。
答案 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
的单词?