Подтвердить что ты не робот

Как объединить два файла с помощью AWK?

Файл 1 имеет 5 полей A B C D E, поле A является целым числом

Файл 2 имеет 3 поля A F G

Количество строк в файле 1 намного больше, чем в файле 2 (от 20 ^ 6 до 5000)

Все записи A в файле 1 появились в поле A в файле 2

Мне нравится объединять два файла по полю A и переносить F и G

Требуемый вывод: A B C D E F G

Пример

Файл 1

 A     B     C    D    E
4050 S00001 31228 3286 0
4050 S00012 31227 4251 0
4049 S00001 28342 3021 1
4048 S00001 46578 4210 0
4048 S00113 31221 4250 0
4047 S00122 31225 4249 0
4046 S00344 31322 4000 1

Файл 2

A     F    G   
4050 12.1 23.6
4049 14.4 47.8   
4048 23.2 43.9
4047 45.5 21.6

Требуемый вывод

A    B      C      D   E F    G
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
4b9b3361

Ответ 1

$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
4046 S00344 31322 4000 1

Ответ 2

К счастью, вам не нужно писать это вообще. Unix имеет команду соединения, чтобы сделать это для вас.

join -1 1 -2 1 File1 File2

Здесь это "в действии":

will-hartungs-computer:tmp will$ cat f1
4050 S00001 31228 3286 0
4050 S00012 31227 4251 0
4049 S00001 28342 3021 1
4048 S00001 46578 4210 0
4048 S00113 31221 4250 0
4047 S00122 31225 4249 0
4046 S00344 31322 4000 1
will-hartungs-computer:tmp will$ cat f2
4050 12.1 23.6
4049 14.4 47.8   
4048 23.2 43.9
4047 45.5 21.6
will-hartungs-computer:tmp will$ join -1 1 -2 1 f1 f2
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
will-hartungs-computer:tmp will$ 

Ответ 3

Вам нужно прочитать записи из файла 2 в пару ассоциативных массивов в блоке BEGIN. Предполагая, что GNU Awk:

BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }

В основном блоке обработки вы читаете строку из файла 1 и печатаете ее с правильными данными из массивов, созданных в блоке BEGIN:

{ print $0, f[$1], g[$1] }

Подайте файл 1 в качестве аргумента имени файла программе.

awk 'BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }
     print $0, f[$1], g[$1] }' "File 1"

Кавычки вокруг аргумента имени файла необходимы из-за пробелов в имени файла. Вам нужны кавычки вокруг имени файла getline, даже если в нем не было пробелов, поскольку в противном случае это было бы имя переменной.

Ответ 4

awk 'BEGIN{OFS=","}  FNR==NR {F[$1]=$2;G[$1]=$3;next} {print $1,$2,$3,$4,$5,F[$1],G[$1]}' file2.txt file1.txt