当两个第一列匹配两个文件并将第一个文件值替换为第二个文件列时,如何合并两个文件...我的意思是......
相同数量的列:
FILE 1:
121212,0100,1.1,1.2,
121212,0200,2.1,2.2,
FILE 2:
121212,0100,3.1,3.2,3.3,
121212,0130,4.1,4.2,4.3,
121212,0200,5.1,5.2,5.3,
121212,0230,6.1,6.2,6.3,
OUTPUT:
121212,0100,3.1,3.2,3.3,
121212,0200,5.1,5.2,5.3,
换句话说,我需要在两个文件中匹配$0
和$1
时打印第二个文件的$2
。我理解逻辑,但我无法使用数组实现它。显然应该使用它。
请花点时间解释一下代码。
答案 0 :(得分:2)
使用awk
打印模式文件中的前两个字段,然后通过管道grep
进行匹配:
$ awk 'BEGIN{OFS=FS=","}{print $1,$2}' file1 | grep -f - file2
121212,0100,3.1,3.2,3.3,
121212,0200,5.1,5.2,5.3,
-f
选项告诉grep
从文件中获取模式,但使用-
代替文件名会使grep
从stdin
获取模式。
因此,第一个awk
脚本生成file1
中的模式,我们使用file2
在grep
中对其进行管道匹配:
$ awk 'BEGIN{OFS=FS=","}{print $1,$2}' file1
121212,0100
121212,0200
您可能希望使用^
将匹配项锚定到该行的开头:
$ awk 'BEGIN{OFS=FS=","}{print "^"$1,$2}' file1
^121212,0100
^121212,0200
$ awk 'BEGIN{OFS=FS=","}{print "^"$1,$2}' file1 | grep -f - file2
121212,0100,3.1,3.2,3.3,
121212,0200,5.1,5.2,5.3,
答案 1 :(得分:1)
这是使用awk
的一种方式:
awk -F, 'FNR==NR { a[$1,$2]; next } ($1,$2) in a' file1 file2
结果:
121212,0100,3.1,3.2,3.3,
121212,0200,5.1,5.2,5.3,