AWK: объединить таблицу, написать пустые поля - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть следующие три файла

file1:
1000001
1000002
100001  COG4658
100002  COG4656
100003
100004  COG2878
100005
100006  COG4657
100007

file2:
1000001
1000002 COG1943
100001  COG4658
100002  COG4656
100003
100004  COG2878
100005
100006  COG4657
100007

file3:
1000001
1000002 NOG04887
100001  COG4658
100002  COG4656
100003
100004  COG2878
100005
100006  COG4657
100007  COG2202

Теперь я написал код, который объединяет файлы и принимает значения для идентификатора в первом столбце в порядке file1 - file2 - file3, если значение должно отсутствовать.

awk 'BEGIN {FS=OFS="\t"} NF > 1 {a[$1] = $2} END {for (i in a) print i, a[i]}' file3 file2 file1

Это дает мне следующий вывод:

1000002 COG1943
100001  COG4658
100002  COG4656
100004  COG2878
100006  COG4657
100007  COG2202

Это правильно, но я бы хотел, чтобы в списке были указаны все значения столбца 1, в том числе, если значения пустые во всех трех файлах. Как мне нужно изменить мой код?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Поскольку у вас в файле одинаковые значения ключей:

awk '
    { val[$1] = (val[$1]=="" ? $2 : val[$1]) }
    ARGIND==3 { print $1, val[$1] }
' file1 file2 file3
1000001
1000002 COG1943
100001 COG4658
100002 COG4656
100003
100004 COG2878
100005
100006 COG4657
100007 COG2202

В приведенном выше примере для ARGIND используется GNU awk, а для других awk вместо ARGIND==3.

используется FILENAME==ARGV[3].
0 голосов
/ 03 ноября 2018

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

awk '
FNR==1{
  count++
}
count==1{
  a[$1]=$2
  next
}
count==2{
  if(($1 in a) && a[$1]==""){
     a[$1]=$2
  }
  if(!($1 in a)){
     a[$1]=$2
  }
  next
}
count==3{
  print $1,a[$1]?a[$1]:$2
}
' OFS="\t"  Input_file1  Input_file2  Input_file3

Вывод будет следующим.

1000001
1000002 COG1943
100001  COG4658
100002  COG4656
100003
100004  COG2878
100005
100006  COG4657
100007  COG2202
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...