Проблема с получением желаемого результата при использовании Grep с просто числами в качестве шаблона - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь извлечь строки из файла 2, который соответствует значениям в файле 1, но вывод дает больше строк.

Файл 1 выглядит следующим образом:

$ head b.txt
5
11
26
27

Файл 2, a.txt, выглядит как

1509 5
1506 11
1507 12
339 26
1000 27
1000 100

Используемая команда:

grep -wFf b.txt a.txt

Результаты, которые я хочу:

1509 5
1506 11
339 26
1000 27

Это дает мне все, что у меня есть в b.txt, но есть и дополнительные строки, например,

1509 5
1506 11
1507 12
339 26
1000 27
1000 100

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Может быть, вы хотите объединить файлы.

join -12 -21 -o1.1,1.2 <(<a.txt sort -k2) <(<b.txt sort)

выведет:

1506 11
339 26
1000 27
1509 5

Команда объединяет второе поле из a.txt со вторым полем из b.txt. «Объединяет» означает, что находит указанные поля в обоих файлах, где они имеют одинаковое значение. Я «соединяю» эти два файла во втором столбце из первого файла и в первом столбце из второго файла. join нужно, чтобы входные данные были отсортированы по объединенным полям, поэтому нам нужно передать их через сортировку. К сожалению, этот метод не сохранит порядок строк в файлах, так как их необходимо переупорядочить, чтобы объединение работало.

0 голосов
/ 12 сентября 2018

Я смоделировал вашу проблему и считаю, что знаю, что происходит. С пустой строкой в ​​конце b.txt я получаю тот же вывод, что и вы. Если я уберу пустую строку в конце b.txt, я получу желаемый результат.

➜  ~ grep -wFf b.txt a.txt
1509 5
1506 11
339 26
1000 27

Из справочной страницы grep:

-f file, --file=file Прочитать один или несколько разделенных строкой символов из файла Пустые строки шаблона соответствуют каждой входной строке. Новые строки не считаются частью шаблона. Если file пусто, ничего соответствует.

Я считаю, что Empty pattern lines match every input line. является причиной вашего ошибочного вывода.

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