Як я можу перенаправляти відповідні рядки до файлу, а невідповідні рядки - до іншого файлу?


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 '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

або коротше:

awk '{print >>(/pattern/?"matched":"unmatched")}'

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