我在文件夹中有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
答案 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
会这样做,但请注意,输出将是未分类的。如果您需要排序输出,可以完成,我将该部分留给您。
现在这样可以这样:
a[$1 FS $2]
的值小于实际行,则将其值更新为实际行。 (这将检查每个文件中的每一行。)你可以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
函数计算第三列中指定的时间