Intereting Posts

Чтение значений из файла и печать этих строк, присутствующих в другом файле

У меня есть два разных файла: file1 с 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 

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

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

Простое решение – использовать команду join для достижения этой цели.

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

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

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

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

 $ 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 чтобы пропустить начальные пробелы, если у вас есть это в ваших файлах ... Страница руководства также предлагает использовать sort -k 1b,1 а также обсуждает использование LC_COLLATE для управления порядком сортировки и объединения ... Надеюсь, это хорошее начало для решения этого вопроса!