удар - слияние 2 файлов с помощью 2 общих столбцов и складывает значения 3-го столбца

Я плохо знаком с использованием оболочки удара и всеми командами Unix. Таким образом, я надеюсь, что мой вопрос не слишком глуп, я не мог найти, что что-либо в ранее заданных вопросах помогло мне решающий мою проблему.

Я создал файл, который похож на это:

apple:::NN \t garden:::NN \t 5
garden:::NN \t great:::Adj \t 1
nice:::Adj \t a:::DT \t 2
etc

Теперь у меня есть другой файл:

apple:::NN \t garden:::NN \t 15
house:::NN \t nice:::Adj \t 1
garden:::NN \t great:::Adj \t 5
etc

Я должен объединить файлы, таким образом, объединенный выходной файл был бы похож на это:

apple:::NN \t garden:::NN \t 20
garden:::NN \t great:::Adj \t 6
nice:::Adj \t a:::DT \t 2
house:::NN \t nice:::Adj \t 1

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

Я могу сделать это вручную использующий 'awk' или 'grep', но действительно ли возможно также сделать это в цикле? Если бы у кого-то есть подсказка для решения проблемы 'строки', которая много уже помогла бы мне!

Самое близкое решение, до которого я мог добраться, следующие файлы Слияния с помощью общего столбца Однако, я не мог получить использование команды соединения 2 столбца плюс сложение значений 3-го столбца.

Я действительно ценю любую справку!

1
задан 13 April 2017 в 15:23

1 ответ

«Классическое» решение для такого рода вещей использует ассоциативный массив в awk:

$ awk 'BEGIN{FS="\t"; OFS=FS} {a[$1 FS $2] += $3;} END {for (i in a) print i, a[i]}' file1 file2
nice:::Adj      a:::DT  2
house:::NN      nice:::Adj      1
apple:::NN      garden:::NN     20
garden:::NN     great:::Adj     6

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

Более новый инструмент, который вы можете попробовать - GNU datamash , который позволяет группировать по полям и различным математическим операциям с результатами, например

$ cat file1 file2 | datamash -s groupby 1,2 sum 3 
apple:::NN      garden:::NN     20
garden:::NN     great:::Adj     6
house:::NN      nice:::Adj      1
nice:::Adj      a:::DT  2
1
ответ дан 7 December 2019 в 15:44

Другие вопросы по тегам:

Похожие вопросы: