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

#bash #awk

#удар #awk #bash

Вопрос:

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

Комментарии:

1. sort join ( cut sed bc ) или awk

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее (если вас устраивает 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
  

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

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

Комментарии:

1. @Blaisem, рад, что это помогло тебе, приятного изучения и обмена информацией на этом замечательном сайте, ТАК что.

2. Могу я также спросить, можно ли это использовать более чем для 2 файлов? Скажем, объединить общую строку из файла 1, файла 2 и файла 3 в выходной файл 4? В принципе, та же задача, что и эта, но включает в себя еще один входной файл для добавления с файлом 1. Я также могу задать новый вопрос, если это проще.

3. @Blaisem, ИМХО, я бы сказал, что лучше задать новый вопрос, иначе люди не поймут, что было изменено и почему было изменено, и что тоже было опубликовано (полная путаница), новый вопрос с вашими усилиями должен быть хорошим, я полагаю, приветствия.

Ответ №2:

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

 $ awk ' $(NF 1)=FILENAME ' blaisem2.txt blaisem1.txt | 
        awk ' { a[$1] =$2; $2=sprintf("%.01f",a[$1]); print } ' | 
             awk ' /blaisem1.txt/ amp;amp; 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

$