У меня есть файл, который выглядит так:

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

Я хочу найти количество строк старше даты 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?

3 ответа3

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

Заметки:

  • Q в sed - это не POSIX, ваш sed может этого не понимать. Если это так, используйте sed '/marker/q' ; но это пройдет линию маркера, вам нужно отфильтровать ее, прежде чем wc -l xor уменьшит конечный результат на единицу.
  • Остерегайтесь пустых строк (если есть); sort поместит их в самом начале, это изменит результат. Мой ответ предполагает, что их нет. Новая строка непосредственно перед EOF (конец файла) в порядке, она не создает пустую строку.
0

Используйте dategrep от dateutils:

$ 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
0

Просто используйте 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).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .