我有一个如下文件:
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
步骤:
- 注入一个半日期标记,该半日期的数值略低于边界日期;
- 应用数字排序;
- 在标记处停止处理,而不越过标记线本身;
- 计数行。
代码(以您的代码开头):
{ 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
笔记:
Q
insed
不是 POSIX,您sed
可能无法理解。如果是这样,请使用sed '/marker/q'
;但这会越过标记线,您需要在wc -l
xor 将最终结果减一之前将其过滤掉。- 注意空行(如果有的话);
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