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


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

Ницца. Без ветвления: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")}'

Его пример показывает, что он хочет перезаписать файлы, если они существуют, а не добавлять.
Крис Даун
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.