AWK сравнивает два столбца из разных файлов и объединяет выходные данные [дубликаты]

Мне нужна помощь :) У меня есть два файла (оба очень большие).

файл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, но не смог получить точный результат, который мне нужен. Спасибо за вашу помощь.


person Fede    schedule 30.09.2020    source источник
comment
Рассмотрим (POSIX) команду 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.2020
comment
Привет, спасибо за ваш ответ, к сожалению, я не могу их сортировать, поэтому я ищу и нестандартное решение.   -  person Fede    schedule 30.09.2020
comment
Почему ты не можешь их отсортировать? Даже для примера данных показанная команда join выдает желаемый результат — плюс-минус расстояние между столбцами (которое является неустойчивым и, следовательно, его чрезвычайно трудно точно воспроизвести).   -  person Jonathan Leffler    schedule 30.09.2020
comment
дублировать вопрос на stackoverflow.com/q/29476542/6266192   -  person Dudi Boy    schedule 30.09.2020
comment
Я не могу, потому что у меня есть несколько строк заголовка (например: 1a04 1a04 ) в файле, которые удаляются, когда я пытаюсь выполнить команду соединения.   -  person Fede    schedule 30.09.2020
comment
Ваш вывод включает заголовок, которого нет в данных (1A04 против 1a04). В вашем описании проблемы не упоминается, что в данных есть строка заголовка. Существуют способы (не особенно красивые, но, тем не менее) обеспечения того, чтобы строки заголовков оставались в верхней части отсортированных данных для файла, например (sed 1q file1; sed 1d file1 | sort), хотя при достаточной осторожности вы можете избежать двух команд sed, особенно если вы используете Вместо этого Перл. Техника two-sed требует «настоящих» файлов; он не будет работать в конвейере или с терминальным вводом.   -  person Jonathan Leffler    schedule 30.09.2020


Ответы (1)


Используя 2 фазы awk, это будет:

awk 'FNR == NR { map[$1]=$2; next} $1 in map { print $0, map[$1] }' file2 file1 |
column -t
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
person anubhava    schedule 30.09.2020
comment
спасибо, я попробовал ваше предложение, но мне кажется, что оно не работает 1a04 1a04 1a04 9 161.9 S 10 143.5 G 11 146.8 G 12 111.5 G 13 100.2 S 14 75.2 > 15 46.1 H 16 90.3 H 17 93.3 H 18 119.9 H 19 178.9 H 20 171.4 H 21 168.4 T 22 169.0 T 23 176.4 T 24 167.0 T 25 164.5 S - person Fede; 30.09.2020
comment
Вывод из ваших образцов файлов прилагается к ответу, не соответствует ли он ожидаемому результату? Проверьте ваши входные файлы, чтобы убедиться, что оба файла имеют 2 столбца и ни в одном из них не заканчивается строка DOS. - person anubhava; 30.09.2020
comment
Да, когда я пытаюсь расширить его на весь файл, вывод совершенно другой (я прикрепил вам только часть файлов примеров). - person Fede; 30.09.2020
comment
Затем предоставьте небольшую выборку фактических данных, о которых идет речь. Я не могу угадать решение, не видя фактических данных. - person anubhava; 30.09.2020
comment
gofile.io/d/zcwtkK - person Fede; 30.09.2020
comment
@Fede: Хммм — 34 МБ или около того данных в двух файлах. Никаких объяснений, что пошло не так. Из-за этого сложно тебе помочь. Вы должны создать MCVE (минимальный, полный, проверяемый пример — или MRE или любое другое имя, которое сейчас использует SO) или SSCCE (Короткий, автономный, правильный пример). Вам по-прежнему может понадобиться внешний сайт для размещения данных, но для выявления проблемы не потребуется 34 МБ. - person Jonathan Leffler; 30.09.2020
comment
Мне удалось использовать команду соединения. Спасибо всем - person Fede; 30.09.2020