Linux 命令从文件中过滤日期字符串并将其与日期进行比较

Linux 命令从文件中过滤日期字符串并将其与日期进行比较

我有一个如下文件:

ASDF,100090,D84,2007-12-29T01:07:35Z
ASDF,101090,F84,2008-01-03T01:09:36Z
ASDF,101190,h84,2008-01-04T01:07:31Z
ASDF,178915,r54,2008-01-15T01:09:21Z
ASDF,144290,k74,2008-02-05T01:03:31Z

我想找出早于 date 的行数2008-01-10。我可以使用以下命令列出日期cut -d "," -f 4 2008A.csv | cut -d "T" -f 1

2007-12-29
2008-01-03
2008-01-04
2008-01-15
2008-02-05

但是我如何找到早于的行数2008-01-10

答案1

步骤:

  1. 注入一个半日期标记,该半日期的数值略低于边界日期;
  2. 应用数字排序;
  3. 在标记处停止处理,而不越过标记线本身;
  4. 计数行。

代码(以您的代码开头):

{ cut -d "," -f 4 2008A.csv | cut -d "T" -f 1; \
printf "2008-01-09.9 marker\n"; } |
sort -n |
sed '/marker/Q' |
wc -l

笔记:

  • Qinsed不是 POSIX,您sed可能无法理解。如果是这样,请使用sed '/marker/q';但这会越过标记线,您需要在wc -lxor 将最终结果减一之前将其过滤掉。
  • 注意空行(如果有的话);sort会将它们放在最开始,这会改变结果。我的答案假设没有。在 EOF(文件结尾)之前换行是可以的,它不会创建一个空行

答案2

只需使用grep

grep -v '2008-01-\(0[0-9]\|10\)' 2008A.csv

或者

grep -v -E '2008-01-(0[0-9]|10)' 2008A.csv

(换句话说,删除所有带有2008-01-0something或 的行2008-01-10)。

答案3

使用dategrep日期工具

$ dategrep '<2008-01-10' <<EOF
ASDF,100090,D84,2007-12-29T01:07:35Z
ASDF,101090,F84,2008-01-03T01:09:36Z
ASDF,101190,h84,2008-01-04T01:07:31Z
ASDF,178915,r54,2008-01-15T01:09:21Z
ASDF,144290,k74,2008-02-05T01:03:31Z
EOF
=>
  ASDF,100090,D84,2007-12-29T01:07:35Z
  ASDF,101090,F84,2008-01-03T01:09:36Z
  ASDF,101190,h84,2008-01-04T01:07:31Z

相关内容