Хорошо, это сводит меня с ума. У меня есть текстовый файл со следующим содержимым:
"1","2","3","4","text","2020-01-01","2020-12-13","4"
"1","2","3","4","text","2020-12-07","2020-12-03","22"
"1","2","3","4","text","2020-12-12","2020-04-11","21"
"1","2","3","4","text","2020-05-21","2020-03-23","453"
и т. д.
Я хочу отфильтровать строки, на которых вторая дата приходится на декабрь, я пробовал такие вещи, как:
grep '.*(\d{4}-\d{2}-\d{2}).*(2020-12-).*' > output.txt
grep '.*\d{4}-\d{2}-\d{2}.*2020-12-.*' > output.txt
grep -P '.*\d{4}-\d{2}-\d{2}.*2020-12-.*' > output.txt
Но ничего не работает. Есть ли способ сделать это с помощью grep, egrep, sed или awk?
Проблема в:
egrep '.*\d{4}-\d{2}-\d{2}.2020-12-.' > output.txt
^ HERE
.
просто соответствует одному символу, но вы хотите пропустить ","
, поэтому измените на:
egrep '.*\d{4}-\d{2}-\d{2}.+2020-12-.' > output.txt
^^ HERE
.
становится .+
.
Это далеко не единственная проблема. grep
обычно вообще не поддерживает \d
, и вы ищете совпадение в любой колонке.
Вам нужно использовать опцию -P
для grep
, чтобы включить Perl-совместимые регулярные выражения, не могли бы вы попробовать следующее. Написано и протестировано с показанными вами образцами.
grep -P '("\d+",){4}"[a-zA-Z]+","2020-12-\d{2}"' Input_file
Объяснение: Добавление пояснений к вышеприведенному, следующее только для пояснений.
grep ##Starting grep command from here.
-P ##Mentioning -P option for enabling PCRE regex with grep.
'("\d+",){4} ##Looking for " digits " comma this combination 4 times here.
"[a-zA-Z]+", ##Then looking for " alphabets ", with this one.
"2020-12-\d{2}" ##Then looking for " 2020-12-07 date " which OP needs.
' Input_file ##Mentioning Input_file name here.
Или, если вы хотите просто найти дату 2020-12-07
в 6-м поле в вашем файле, мы могли бы просто сделать awk -F'","' '$6= = "2020-12-12"' Input_file
и для этого.
Обратите внимание, что OP хочет любую дату в декабре. Я согласен, однако, что awk
, вероятно, лучше, поскольку здесь есть отдельные столбцы.
@KenY-N, конечно, спасибо, что сообщили, теперь я изменил регулярное выражение, чтобы поймать любую дату в декабре.
Я попробовал это с небольшой модификацией, например: grep -P '.*"\d{4}-\d{2}-\d{2}","2020-12-\d{2}"' in. csv > december_2020.csv Игнорировать первый столбец даты... и это работает! Я думаю, что -P сделал очарование, спасибо!
Используйте grep -P
или egrep
для краткости:
$ cat test.txt
"1","2","3","4","text","2020-01-01","2020-12-13","4"
"1","2","3","4","text","2020-12-07","2020-12-03","22"
"1","2","3","4","text","2020-12-12","2020-04-11","21"
"1","2","3","4","text","2020-05-21","2020-03-23","453"
$
$ grep -P '^"([^"]*","){6}2020-12-' test.txt
"1","2","3","4","text","2020-01-01","2020-12-13","4"
"1","2","3","4","text","2020-12-07","2020-12-03","22"
$
$ egrep '^"([^"]*","){6}2020-12-' test.txt
"1","2","3","4","text","2020-01-01","2020-12-13","4"
"1","2","3","4","text","2020-12-07","2020-12-03","22"
Объяснение:
^"
- ожидайте, что "
начнется([^"]*","){6}
- просмотреть все символы, кроме "
, а затем ","
; повторить это 6 раз2020-12-
- ожидать 202012-
Я предлагаю альтернативное решение awk
из-за того, что входные данные структурированы по строкам и столбцам с использованием общего разделителя:
awk -F, '$7 ~ /-12-/' file
"1","2","3","4","text","2020-01-01","2020-12-13","4"
"1","2","3","4","text","2020-12-07","2020-12-03","22"
Ага, тоже пробовал, тоже работает. Спасибо.
См.: Фильтрация строк в grep