У меня есть два разных файла: файл 1 с 1 миллионом записей и файл 2 с 1,3 миллионами записей. Мой файл 1 выглядит так

A  54 54 67 abcd
C 54 4 1.2 lmno
D 43 2 22.2 asdasd

File2 выглядит аналогично

A 0 1.1 1 qr
D 2 1 1 rerlm

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

Мне нужно напечатать все такие строки file1, которые соответствуют первому столбцу в файле2. В двух словах распечатайте все строки в файле1 и сохраните их в файле3 в зависимости от того, присутствует ли первая запись столбца в файле2.

2
Jeff Schaller 26 Июл 2018 в 11:10

1 ответ

Простое решение — использовать для этого команду join.

Для этого требуется, чтобы оба файла были отсортированы, так как join работает только в этих случаях... Вы можете использовать sort для сортировки файлов, если они не отсортированы.

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

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

Итак, если вы согласны с этими ограничениями, все, что вам нужно сделать, это:

$ join -o 1.1,1.2,1.3,1.4,1.5 file1 file2
A 54 54 67 abcd
D 43 2 22.2 asdasd

Если файлы не отсортированы, проще всего использовать процесс bash. замены, чтобы сортировать их на лету и передавать join:

$ join -o 1.1,1.2,1.3,1.4,1.5 <(sort file1) <(sort file2)

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

Небольшое примечание, что это зависит от вашей локали (которая определяет порядок сортировки), вы также можете передать sort параметр -b, чтобы пропустить начальные пробелы, если они есть в ваших файлах... Человек страница join также предлагает использовать sort -k 1b,1, а также обсуждает использование LC_COLLATE для управления порядком сортировки и объединения... Надеюсь, это хорошее начало для решения этого вопроса!

0
filbranden 26 Июл 2018 в 06:48