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

#awk #text

#awk #текст

Вопрос:

У меня есть два файла:

01File:

 1   2051
2   1244
7   917
X   850
22  444
21  233
Y   47
KI270728_1  6
KI270727_1  4
KI270734_1  3
KI270726_1  2
KI270713_1  2
GL000195_1  2
GL000194_1  2
KI270731_1  1
KI270721_1  1
KI270711_1  1
GL000219_1  1
GL000218_1  1
GL000213_1  1
GL000205_2  1
GL000009_2  1
  

и 02File:

 1   248956422
2   242193529
7   159345973
X   156040895
Y   56887902
22  50818468
21  46709983
KI270728_1  1872759
KI270727_1  448248
KI270726_1  43739
GL000009_2  201709
KI270322_1  21476
GL000226_1  15008
KI270311_1  12399
KI270366_1  8320
KI270511_1  8127
KI270448_1  7992
  

Мне нужно объединить эти два файла на основе поля 01 и напечатать «0» в результирующих пустых полях.

Я пытался выполнить это с помощью следующей команды:

  awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0 "t" a[$1]}' 01File 02File
  

Что приводит к следующему выводу:

 1   248956422   2051 
2   242193529   1244 
7   159345973   917 
X   156040895   850 
Y   56887902    47 
22  50818468    444 
21  46709983    233 
KI270728_1  1872759 6 
KI270727_1  448248  4 
KI270726_1  43739   2 
GL000009_2  201709  1 
KI270322_1  21476   
GL000226_1  15008   
KI270311_1  12399   
KI270366_1  8320    
KI270511_1  8127    
KI270448_1  7992
  

Однако у меня возникли проблемы с адаптацией команды, чтобы иметь возможность печатать, в данном случае нулевое значение «0» в результирующих пустых полях, чтобы сгенерировать следующий вывод:

 1   248956422   2051 
2   242193529   1244 
7   159345973   917 
X   156040895   850 
Y   56887902    47 
22  50818468    444 
21  46709983    233 
KI270728_1  1872759 6 
KI270727_1  448248  4 
KI270726_1  43739   2 
GL000009_2  201709  1 
KI270322_1  21476   0
GL000226_1  15008   0
KI270311_1  12399   0
KI270366_1  8320    0
KI270511_1  8127    0
KI270448_1  7992    0
  

Я был бы признателен, если вы сможете направить меня в правильном направлении

Ответ №1:

Используйте условное выражение вместо a[1] . Вместо пустой строки будет напечатано «0», если ни одна строка не совпадает.

 awk 'FNR==NR{a[$1]=$2;next} {print $0 "t" ($1 in a? a[$1]: "0")}' 01File 02File
  

Также я упростил первое действие, так как есть только 2 поля.

Вывод:

 1   248956422   2051
2   242193529   1244
7   159345973   917
X   156040895   850
Y   56887902    47
22  50818468    444
21  46709983    233
KI270728_1  1872759 6
KI270727_1  448248  4
KI270726_1  43739   2
GL000009_2  201709  1
KI270322_1  21476   0
GL000226_1  15008   0
KI270311_1  12399   0
KI270366_1  8320    0
KI270511_1  8127    0
KI270448_1  7992    0