Я плохо знаком с использованием оболочки удара и всеми командами 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-го столбца.
Я действительно ценю любую справку!
«Классическое» решение для такого рода вещей использует ассоциативный массив в 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