Объединение двух файлов, соответствующих двум столбцам, с несоответствиями и в каждой совпадающей строке , замените второй столбец из файла 1 на 6-й столбец в файле 2

Чтобы избежать сортировки, вы можете сделать:

awk 'NR == 1 || $2 > max {number = $1; max = $2}
     END {if (NR) print number, max}' < file

или, если входные данные содержат только один столбец, и вы хотите узнать номер строки с максимальным значением:

awk 'NR == 1 || $1 > max {number = NR; max = $1}
     END {if (NR) print number, max}' < file
1
01.11.2018, 15:34
2 ответа

Когда есть так много полей, я склонен предпочесть awk:

$ awk 'NR==FNR{a[$1]=$2; next}{if($2 in a){$6=a[$2]}}1;' file1 file2 
0 098 0 0 0 -9 x
0 099 0 0 0 -9 x
0 100 0 0 0 -9 x
0 101 0 0 0 -9 x
0 102 0 0 0 13.342 x
0 103 0 0 0 7.456 x
0 104 0 0 0 -9 x
0 105 0 0 0 6.453 x
0 106 0 0 0 -9 x
0 106 0 0 0 -9 x
0 107 0 0 0 3.567 x
0 108 0 0 0 4.210 x

Explanation

  • NR==FNR{a[$1]=$2; next} : NR - номер текущей строки, а FNR - номер текущей строки текущего файла. При обработке более одного файла эти два параметра будут равны только во время чтения 1-го файла. a[$1]=$2 использует st поле как ключ к массиву, значением которого является 2-е поле. nextпереходит к следующей строке. Так, это сохранит все значения изfile1в массивa`.

  • if($2 in a){$6=a[$2]} : теперь мы читаем второй файл. Если второе поле этой строки присутствует в массиве a, установите 6-е поле ($6) равным тому, что хранилось в a для второго поля.

  • 1; : это сокращение для "напечатать эту строку".

2
27.01.2020, 23:19

Если оба файла отсортированы по ключевым полям (а 6-е поле обычно -9)

join -1 2 -a 1 -e '-9' -o 1.1 1.2 1.3 1.4 1.5 2.2 1.7 file2 file1

сделайте работу (спасибо steeldriver за исправление)
. Но более правильным может быть sed`s форматирование:

join -1 2 -a 1 2 1 -o 1.1,1.2,1.3,1.4,1.5,1.6,2.2,1.7 |
sed 's/ \S*\( \S\+\)/\1/3'

Если вы предпочитаете awk и уверены, что есть все ключи из file1 в file2

awk '{
    a=0
    do {
        if (a)
           print a
        getline a <"file2"
        split(a,A)
        }
    while($1 != A[2])
    i=0
    A[6]=$2
    for(i in A)
        printf("%s ",A[i++])
    print ""
    }' file1
2
27.01.2020, 23:19

Теги

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