2010-11-18 4 views
3

Давайте предположим, что есть файл, который выглядит следующим образом:Разделить вход на несколько выходов на основе содержимого?

xxxx aa whatever 
yyyy bb whatever 
zzzz aa whatever 

Я хотел бы разделить его на 2 файлов, содержащих:

первый:

xxxx aa whatever 
zzzz aa whatever 

второй:

yyyy bb whatever 

Т.е. Я хочу сгруппировать строки на основе некоторого значения в строках (правило может быть: 2-е слово разделено пробелами), но не меняйте порядок строк внутри групп.

Конечно, я могу написать программу, чтобы сделать это, но мне интересно, есть ли какой-нибудь готовый инструмент, который может сделать что-то вроде этого?

Извините, я не упоминал об этом, так как я предполагал, что это довольно очевидно - количество разных слов «огромное». мы говорим о не менее чем 10000 из них. То есть любое решение, основанное на перечислении слов перед началом, не будет работать.

А также - мне не очень понравилось многопроходное разделение - файлы, о которых идет речь, обычно довольно большие.

ответ

6

Это создаст файлы с именем output.aa, output.bb и т.д .:

awk '{print >> "output." $2}' input.file 
+0

Это замечательно! Он даже делает буферизацию для ограничения количества операций ввода-вывода. Большое спасибо. – 2010-11-18 18:34:34

1

Ну, вы можете сделать grep, чтобы получить линии, которые соответствуют, и grep -v, чтобы получить линии, которые не совпадают.

Хм, вы могли бы сделать sort -f" " -s -k 2,2, но это O (n log n).

+0

Circa 1994 я обсуждал с тогдашним сопровождающему GNU Grep, можно ли добавить флаг иметь спички в стандартный вывод и других линий Stderr, но ему не понравилась идея :-). –

Смежные вопросы