Мне нужна помощь :) У меня есть два файла (оба очень большие).
файл1:
1a04 1a04
9 161.9
10 143.5
11 146.8
12 111.5
13 100.2
14 75.2
15 46.1
16 90.3
17 93.3
18 119.9
19 178.9
20 171.4
21 168.4
22 169.0
23 176.4
24 167.0
25 164.5
файл2
1a04 1a04
5 0
6 -
7 E
8 E
9 E
10 E
11 E
12 E
13 -
14 S
15 >>
16 H
17 H
18 H
19 H
20 H
Я хочу сравнить первые столбцы двух файлов и, если они совпадают, объединить их в новый файл. Итак, желаемый результат, который мне нужен:
1a04 1a04 1A04
9 161.9 E
10 143.5 E
11 146.8 E
12 111.5 E
13 100.2 -
14 75.2 S
15 46.1 >>
16 90.3 H
17 93.3 H
18 119.9 H
19 178.9 H
20 171.4 H
Я пробовал несколько комбинаций awk, но не смог получить точный результат, который мне нужен. Спасибо за вашу помощь.
join
вместоawk
. Предполагая, что файлыfile1
иfile2
отсортированы,join -o 1.1,1.2,2.2 file1 file2
. Если они не отсортированы, сначала отсортируйте их или используйте подстановка процесса:join -o1.1,1.2,2.2 <(sort file1) <(sort file2)
. - person Jonathan Leffler   schedule 30.09.2020join
выдает желаемый результат — плюс-минус расстояние между столбцами (которое является неустойчивым и, следовательно, его чрезвычайно трудно точно воспроизвести). - person Jonathan Leffler   schedule 30.09.20201A04
против1a04
). В вашем описании проблемы не упоминается, что в данных есть строка заголовка. Существуют способы (не особенно красивые, но, тем не менее) обеспечения того, чтобы строки заголовков оставались в верхней части отсортированных данных для файла, например(sed 1q file1; sed 1d file1 | sort)
, хотя при достаточной осторожности вы можете избежать двух командsed
, особенно если вы используете Вместо этого Перл. Техника two-sed
требует «настоящих» файлов; он не будет работать в конвейере или с терминальным вводом. - person Jonathan Leffler   schedule 30.09.2020