1

我有两个文件我正在尝试根据第 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
4

2 回答 2

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以美化 file3:

awk '...' file1 file2 | column -t > file3
于 2013-09-24T14:36:37.500 回答
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。

于 2013-09-25T20:29:04.723 回答