我有sample.txt文件,其中文件中的数据如下所示:
LINE 1|2017-02-19|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-02-06|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-03-06|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-02-07|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-03-25|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-02-06|LINE 3|LINE 4| LINE 5 | LINE 6
现在我想从sample.txt文件中获取数据
2017-02-19
2017-02-06
2017-03-06
2017-02-07
2017-03-25
2017-02-06
> 2017-02-19
所以我的输出应该看起来像
LINE 1|2017-03-06|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-03-25|LINE 3|LINE 4| LINE 5 | LINE 6
答案 0 :(得分:1)
FS
设为|
date -d[DATE] +[OUTPUT_FORMAT]…
会将字段2($2
)格式化为自 unix epoch (%s
)以来的秒数并将其传递给变量d
d
小于2017-02-19
,其中纪元为1487480400
后的秒数,如果为真将打印整个记录{{ 1}} $0
注意:您可以通过将awk 'BEGIN{FS="|";} { "date -d"$2" +%s" | getline d;} d < 1487480400 { print $0; }'
更改为print $0;
,print $1;
甚至print $1,$2;
例如,您可以在命令行中使用print $1"anythingYouWantHereQuoted"$2;
找到自Unix纪元以来的秒数。
答案 1 :(得分:0)
逐行读取文件, 隔离日期, 比较日期(格式化为数字), 跳过该行,或打印该行
#!/bin/ksh
compareDay=$( date -d '2017-02-19' "+%Y%j" ) # build a number from <year><day of year>
cat sample.txt | while read line; do
day="${line#*\|}" # remove from the beginning to first |
day="${day%%\|*}" # remove from the end (%%=all) up from |
# compare, skip if condition not met
[[ $( date -d $day "+%Y%j" ) -gt $compareDay ]] || continue
echo "$line" # output the remaining line meeting the condition
done
这假设您可能必须处理第一列中具有不同值的输入。否则,@ bren的解决方案就足够了。
哪个在ksh中
cat sample.txt | while read line; do
[[ $line > 'LINE 1|2017-02-20' ]] || continue
echo "$line"
done