AWK:根据密钥和最新日期合并两个文件

时间:2014-04-04 07:10:04

标签: unix sed awk

我在文件夹中有3个文件:/ home / amaxxxx / EXTRACT / 2w /

File 1.txt
A|B|02/26/2014 15:00:37
--edit A|B|9999|02/26/2014 15:00:37

File 2.txt
A|B|04/04/2014 12:00:37
--edit A|B|1|04/04/2014 12:00:37

File 3.txt
A|B|02/01/2014 12:00:37
--edit A|B|9999999|02/01/2014 12:00:37

我使用

成功合并了所有文件
awk -F"|" '!a[$1FS$2]++' /home/amaxxxx/EXTRACT/2w/* > mergedfile.txt

**Output:**
A,B,02/26/2014 15:00:37

但我想合并两个带有最新日期的文件,以获得如下输出删除时间戳。请指导

A|B|04/04/2014

2 个答案:

答案 0 :(得分:1)

gawk -F '|' '{if ( a[$1 FS $2] < $0 ) {a[$1 FS $2]=$0} } }
             END {for (k in a) { print gensub(" .*","",a[k]) } }' /home/amaxxxx/EXTRACT/2w/* > mergedfile.txt

会这样做,但请注意,输出将是未分类的。如果您需要排序输出,可以完成,我将该部分留给您。

现在这样可以这样:

  1. 如果a[$1 FS $2]的值小于实际行,则将其值更新为实际行。 (这将检查每个文件中的每一行。)
  2. 最后打印每一行(现在最大值为$ 3)。
  3. 你可以see it in action here at ideone。 (注意,这会在FS块中设置BEGIN变量,因为ideone不允许对-F使用awk开关。

答案 1 :(得分:1)

试试这个(需要GNU awk):

awk '
BEGIN { FS = OFS = "|" }
{
    fld4 = $NF;
    sub(/ .*/,"",$NF);
    split(fld4, d, /[:/ ]/);
    ts = mktime(d[3]" "d[1]" "d[2]" "d[4]" "d[5]" "d[6])
    if(a[$1,$2]) {   
        line[$1,$2] = (ts > a[$1,$2]) ? $0 : line[$1,$2]         
    }
    else {
        line[$1,$2] = $0   
        a[$1,$2] = ts   
    }
}
END {
    for(x in line) print line[x]
}' f1.txt f2.txt ...

说明:

  • 您使用GNU awk mktime函数计算第三列中指定的时间
  • 只有在时间较新时才更新哈希中的密钥。如果在同一个键上找到的时间较旧,则保留较新的值。