Как перенаправить совпадающие строки в файл, а несовпадающие строки - в другой файл?

13

Есть ли уже оптимизированный сценарий / программа / утилита для следующего требования?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch
Балки
источник

Ответы:

16

Вы могли бы использовать awkдля этого.

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
Крис Даун
источник
1
Я не совсем знаком с, awkно в какой момент он оценивает >? Если его оценивать каждый раз, когда применяется условное условие, вы получите два однострочных файла ...
Шадур
1
@Shadur >печатает весь вывод в файл, перезаписывая существующие файлы. Это не оценивается таким образом, что это приведет к тому, что любые новые строки будут перезаписывать старый вывод из того же экземпляра awk. То есть, если есть несколько совпадений, файл «совпадение» будет содержать каждое совпадение, разделенное OFS. Разница между >и >>существует в обработке существующих файлов.
Крис Даун
10

Вот sedпример:
Примечание: wкоманда sed будет перезаписывать существующий файл при каждом запуске сценария, но только если эта конкретная команда записи запущена; следовательноrm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file
Peter.O
источник
Ницца. Без ветвления:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti
6

Вы можете добавлять файлы в awk:

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

или короче:

awk '{print >>(/pattern/?"matched":"unmatched")}'
Михал Шрайер
источник
Его пример показывает, что он хочет перезаписать файлы, если они существуют, а не добавлять.
Крис Даун