Как я могу направить вывод комм в файл? - PullRequest
1 голос
/ 08 февраля 2012

Я использовал команду comm для сравнения двух файлов, но не могу передать его в третий файл:

comm file1 file2 > file3 

comm: file 1 is not in sorted order
comm: file 2 is not in sorted order

Как мне это сделать? Файлы уже отсортированы.

(comm file1 file2 работает и распечатывает)

пример ввода:
file1:

21
24
31
36
40
87
105
134
...

file2:

10
21
31
36
40
40
87
103
...

comm file1 file2: works

comm file1 file2 > file3 

comm: file 1 is not in sorted order
comm: file 2 is not in sorted order

Ответы [ 6 ]

4 голосов
/ 09 февраля 2012

Вы отсортировали по численности;comm работает с лексически отсортированными файлами.

Например, в file2 строка 103 резко вышла из строя со строками 21..87.Ваши файлы должны быть ' plain sort sorted '.

Если у вас есть bash (4.x), вы можете использовать подстановку процесса:

comm <(sort file1) <(sort file2)

Это запускает две команды и гарантирует, что процесс comm сможет прочитать их стандартный вывод, как если бы они были файлами.

В противном случае:

(
sort -o file1 file1 &
sort -o file2 file2 &
wait
comm file1 file2
)

Используется параллелизм дляполучить файл отсортирован одновременно.Под-оболочка (в ( ... )) гарантирует, что вам не придется ждать завершения других фоновых процессов.

3 голосов
/ 08 февраля 2012

Ваш пример данных НЕ отсортирован лексикографически (как в словаре), что и ожидают команды типа comm и sort (без опции -n), где, например, 100 должнобыть до 20.

Вы уверены, что просто не замечаете сообщение об ошибке, если не перенаправляете вывод, так как ошибка будет смешана с выходными линиями на терминале?

1 голос
/ 09 февраля 2012

Я не получаю те же результаты, что и вы, но, возможно, ваша версия comm жалуется на то, что файлы не отсортированы лексически.Используя предоставленные вами данные (... делает это интересным, я знаю, что это не часть ваших реальных файлов.)

$ comm file[12]
        10
                21
24
                31
                36
                40
        40
                87
        103
        ...
105
134
...

Я был удивлен, что ... не было в третьем столбце,поэтому я попытался:

$ comm <(sort file1) <(sort file2)
                ...
        10
        103
105
134
                21
24
                31
                36
                40
        40
                87

Это лучше, но 105> 24, верно?

$ comm <(sort -n file1) <(sort -n file2)
                ...
        10
                21
24
                31
                36
                40
        40
                87
        103
105
134

Я думаю, что это были результаты, которые вы ищете.Два 40 также интересны.Если вы хотите устранить это:

$ comm <(sort -nu file1) <(sort -nu file2)
                ...
        10
                21
24
                31
                36
                40
                87
        103
105
134
1 голос
/ 08 февраля 2012

Попробуйте:

sort -o file1 file1
sort -o file2 file2
comm file1 file2 > file3
1 голос
/ 08 февраля 2012

Сначала необходимо отсортировать файлы с помощью программы sort.

0 голосов
/ 26 октября 2012

Я столкнулся с подобной проблемой, когда comm жаловался, хотя я пробежал sort.Проблема была в том, что я запускал Cygwin, и sort указывал на какую-то версию MSDOS (я думаю).Используя определенный путь (C: \ Cygwin \ bin \ sort в моем случае), он работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...