-1

尝试在 linux 命令行中执行此操作。想要合并两个文件,根据 ID 比较值,但只保留具有较新/较大日期值的 ID(编辑:等于或大于)。因为 ID 456604 在两个文件中,所以只想保留文件 2 中日期较新的一个:“20111015 456604 tgf”

文件 1

Date     ID     Note
20101009 456604 abc
20101009 444444 abc
20101009 555555 abc
20101009 666666 xyz

文件 2

Date     ID     Note
20111015 111111 abc
20111015 222222 abc
20111015 333333 xyz
20111015 456604 tgf

然后输出将两个文件合并,但只保留第二个 ID 值和较新的日期。行的顺序无关紧要,只是概念输出的示例。

输出

Date     ID     Note
20101009 444444 abc
20101009 555555 abc
20101009 666666 xyz
20111015 111111 abc
20111015 222222 abc
20111015 333333 xyz
20111015 456604 tgf
4

3 回答 3

2
$ cat file1.txt file2.txt | sort -ru | awk '!($2 in seen) { print; seen[$2] }'

Date     ID     Note
20111015 456604 tgf
20111015 333333 xyz
20111015 222222 abc
20111015 111111 abc
20101009 666666 xyz
20101009 555555 abc
20101009 444444 abc

按日期降序对组合文件进行排序,并且仅在您第一次看到 ID 时打印一行。

编辑

更紧凑的版本,感谢史蒂夫:

cat file1.txt file2.txt | sort -ru | awk '!seen[$2]++'
于 2014-12-30T01:27:27.320 回答
0

您没有指定如果日期也重复,或者即使这种情况可能存在,您希望如何处理此案。因此,我假设“大于”实际上是指“大于或等于”(这也使得处理标题更容易一些)。如果不是这种情况,请编辑您的问题。

代码:

awk 'FNR==NR {
    a[$2]=$1
    b[$2]=$0
    next
}

a[$2] >= $1 {
    print b[$2]
    delete b[$2]
    next
}

1

END {
    for (i in b) {
        print b[i]
    }
}' file2 file1

解释:

基本上,我们使用一个名为 的关联数组a将“ID”和“Date”分别存储为键和值。我们还file2使用另一个名为 的关联数组将 的内容存储在内存中b。读取时file1,我们测试数组中是否存在第二列a,以及键的值是否大于或等于第一列。如果是,我们从 array 打印相应的行b,然后从 array 中删除它,并next到输入的下一行/记录。on it's lonesome1将返回 true,从而在不满足前(两个)条件的情况下启用打印。这具有从 打印任何不匹配的记录的效果file1。最后,我们打印 array 中剩下的内容b

结果:

Date     ID     Note
20111015 456604 tgf
20101009 444444 abc
20101009 555555 abc
20101009 666666 xyz
20111015 222222 abc
20111015 111111 abc
20111015 333333 xyz
于 2014-12-30T01:10:56.753 回答
0

另一种 awk 方式

awk 'NR==1;FNR>1{a[$2]=(a[$2]<$1&&b[$2]=$3)?$1:a[$2]}
     END{for(i in a)print a[i],i,b[i]}' file file2

将数组中的值与先前存储的值进行比较以确定哪个更高,如果当前记录更高,则还存储第三个字段。
然后打印出存储的日期、键(字段 2)和为字段 3 存储的值。

或者更短

awk 'NR==1;FNR>1{(a[$2]<$1&&b[$2]=$0)&&a[$2]=$1}END{for(i in b)print b[i]}' file file2
于 2014-12-30T03:11:27.433 回答