我正在使用Python
处理来自hadoop文件系统的输出,其中包含时间戳和文件名。
由于输出很长,我想只打印尚未检查的行。
为此,我将存储时间戳last_ts
,这是系统最后一次检查。
要打印整个输出,我正在使用命令
hadoop fs -ls /path/to/donemarkerfiles/ | sort -k 6 |awk '{print $6" "$7" "$8} '
其中6是日,7是时间,8是内容。
我想将6和7与last_ts
进行比较,并仅打印某些行。
我该怎么做?我试图在if
中使用awk
条件,但我偶然发现并放弃了。
示例输出:
2014-06-23 05:45 /user/hdfs/warehouse/donemarkers/20140621_basic.done
2014-06-23 07:13 /user/hdfs/warehouse/donemarkers/20140621_stat.done
2014-06-23 08:08 /user/hdfs/warehouse/donemarkers/20140621_raw.done
2014-06-23 09:30 /user/hdfs/warehouse/donemarkers/20140621_join.done
2014-06-23 09:31 /user/hdfs/warehouse/donemarkers/20140621_upload_file.done
2014-06-23 15:52 /user/hdfs/warehouse/donemarkers/20140622_basic.done
2014-06-23 20:23 /user/hdfs/warehouse/donemarkers/20140622_stat.done
2014-06-23 21:40 /user/hdfs/warehouse/donemarkers/20140622_raw.done
2014-06-23 22:57 /user/hdfs/warehouse/donemarkers/20140622_join.done
2014-06-23 22:58 /user/hdfs/warehouse/donemarkers/20140622_upload_file.done
答案 0 :(得分:2)
这个很难理解,我想这主要是因为我不是一个awk专家。然而,这很重要:
cat /tmp/data | awk '{"date -d \"" $1 " " $2 "\" +%s"|getline secs; print secs, $0}'
使用awk调用标准date
util格式化为epoch secs,并使用getline将该返回值赋给awk变量。在我的命令中,我只是将所有内容都打印出来,现在让我们进行过滤。
cat /tmp/data | awk '{"date -d \"" last_ts "\" +%s"|getline mindate; "date -d \"" $1 " " $2 "\" +%s"|getline secs; if (secs > mindate) print $0}'
现在我们在那里有两个cmd|getline var
形式的东西,看起来很笨拙。我会把它放在一个脚本中(带注释),但我从不输入它' live'。另外,我不清楚last_ts
的生活地点。在awk脚本中已经?