Как добавить два столбца из двух разных файлов со ссылкой на совпадающие значения в другом столбце? - PullRequest
0 голосов
/ 05 марта 2019

Файл 1:

1  0.3
2  0.1
3  0.4
4  0.8

Файл 2:

2  0.7
4  0.2
6  0.5
8  0.9

Изучая поля 1 в файлах 1 и 2, мы видим, что строки 2 и 4 являются общими.Это мои справочные строки.Для этих ссылочных строк я хотел бы добавить значения из поля 2 в оба файла.

Другими словами,

  • поиск в файлах 1 и 2 соответствующих строк в $ 1.В этом случае 2 и 4.

  • для $ 1 = 2, затем $ 2 = 0,1 + 0,7 = 0,8

  • для $ 1 = 4,затем $ 2 = 0,8 + 0,2 = 1,0

Желаемый результат в файле 3:

1 0.3
2 0.8
3 0.4
4 1.0

А именно, файл 3 = файл 1, кроме строк, где $ 1 вФайл 1 соответствует $ 1 в файле 2, были добавлены вместе в $ 2.

Сводка

Я хотел бы сценарий, который может искать совпадения в $ 1 между двумя файлами,затем выведите $ 2 (Файл 1) + $ 2 (Файл 2) везде, где найдено совпадение $ 1.Выходные данные - Файл 3, который печатает Файл 1 с новыми суммированными значениями, где бы ни происходили совпадения.Любая помощь очень ценится!

Ответы [ 2 ]

3 голосов
/ 05 марта 2019

Не могли бы вы попробовать следующее (если вы в порядке с awk).

awk 'FNR==NR{a[$1]=$2;next} {$2=$1 in a?$2+a[$1]:$2} 1' Input_file2  Input_file1

Если вы хотите иметь плавающую точку до 1 вместе с правильным форматом табуляции в выводе, попробуйте следующее.

awk 'FNR==NR{a[$1]=$2;next} $1 in a{$2=sprintf("%.01f",$2+a[$1])} 1' Input_file2  Input_file1 | column -t

Или, согласно комментарию Эда сэра, нам не нужно проверять $1 in a, поэтому удаляем его из кода.

awk 'FNR==NR{a[$1]=$2;next} {$2=sprintf("%.01f",$2+a[$1])} 1' Input_file2  Input_file1 | column -t
0 голосов
/ 05 марта 2019

Использование конвейерных awk х

$ awk ' $(NF+1)=FILENAME ' blaisem2.txt blaisem1.txt | 
        awk ' { a[$1]+=$2; $2=sprintf("%.01f",a[$1]); print } ' | 
             awk ' /blaisem1.txt/ && NF-- '
1 0.3
2 0.8
3 0.4
4 1.0

$

где файлы

$ cat blaisem1.txt
1  0.3
2  0.1
3  0.4
4  0.8

$ cat blaisem2.txt
2  0.7
4  0.2
6  0.5
8  0.9

$

Может быть дополнительно сокращено с 2 awks как

$ awk ' $(NF+1)=FILENAME ' blaisem2.txt blaisem1.txt | 
    awk ' { a[$1]+=$2; $2=sprintf("%.01f",a[$1]); } /blaisem1.txt/ { NF--; print } '
1 0.3
2 0.8
3 0.4
4 1.0

$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...