我有两个文件,我正在尝试根据第1列和第2列加入/合并。 它们看起来像这样,“文件1”比文件2短得多,我想找到这两个文件的交集: 如果记录不匹配,则需要使用不同的字符串更新最后一列。
以下示例:
文件1:
1047 510 75 Live
1048 510 75 Live
1049 510 75 Live
1627 510 75 Live
1628 510 75 Live
1629 510 75 Live
文件2:
1047 510 75 Live
1048 510 75 Live
1049 510 75 Live
107 510 39 Live
108 510 39 Live
109 510 39 Live
117 510 39 Live
118 510 39 Live
119 510 39 Live
1627 510 75 Live
1628 510 75 Live
1629 510 75 Live
17 510 75 Live
目标:文件3
1047 510 75 Live
1048 510 75 Live
1049 510 75 Live
107 510 39 Test
108 510 39 Test
109 510 39 Test
117 510 39 Test
118 510 39 Test
119 510 39 Test
1627 510 75 Live
1628 510 75 Live
1629 510 75 Live
17 510 75 Test
答案 0 :(得分:4)
两种方法。
使用comm
获取联合和差异:
{
# lines in common
comm -12 <(sort file1) <(sort file2)
# lines only in file2
comm -13 <(sort file1) <(sort file2) | awk '{$NF="Test"} 1'
} > file3
或者,坚持使用awk
awk '
# read and store file1
NR==FNR {f1[$0]; next}
# for file2 lines not in file1, alter the last field
!($0 in f1) {$NF = "Test"}
# print each line
1
' file1 file2 > file3
您可以通过column -t
管道输出以美化文件3:
awk '...' file1 file2 | column -t > file3
答案 1 :(得分:0)
这可能适合你(GNU sed):
sed -r 's|^(\S+\s+\S+\s+).*|/^\1/s/.*/&/;t|;$a\s/\\S+$/Test/' file1 |
sed -rf - file2 >file3
这将从file1生成一个sed脚本,它将file2中与file1的前两个字段匹配的行替换为file1中匹配行的内容。那些不匹配的行会使用Test
更新不匹配行的最后一列。结果将打印到file3。