AWK: продолжайте добавлять информацию в ту же строку в новом столбце в файл1 из файла2, сопоставляя определенный столбец - PullRequest
1 голос
/ 05 мая 2020

Оба моих файла выглядят так

file1

NC_000001.11:g.100007038C>T
NC_000001.11:g.100007039C>A

file2

NC_000001.11:g.100007038C>T     NM_001271684.2:c.347C>T     NP_001258613.1:p.Thr116Met
NC_000001.11:g.100007038C>T     NM_001271685.2:c.473C>T     NP_001258614.1:p.Thr158Met
NC_000001.11:g.100007038C>T     NM_012243.3:c.347C>T        NP_036375.1:p.Thr116Met
NC_000001.11:g.100007039G>A     NM_001271684.2:c.348G>A     NP_001258613.1:p.Thr116%3D
NC_000001.11:g.100007039G>A     NM_001271685.2:c.474G>A     NP_001258614.1:p.Thr158%3D

Мой желаемый результат:

Я хочу сопоставить первый столбец от file2 до первого столбца моего file1. Если совпадение верно, то я хочу добавить третий столбец file2 к новому столбцу в file1, например, чтобы получить:

file1

NC_000001.11:g.100007038C>T     NP_001258613.1:p.Thr116Met, NP_001258614.1:p.Thr158Met, NP_036375.1:p.Thr116Met

Вот моя попытка:

awk 'BEGIN{ FS=OFS="\t" }
NR==FNR {a[$0]; next;}
{
        for (k in a) {
            if ($1 == k) {
                print $0 "\t" a[$3]
            }
        }
}' file1.txt file2.txt

Но не даст желаемого результата:

NC_000001.11:g.100007038C>T     NM_001271684.2:c.347C>T     NP_001258613.1:p.Thr116Met
NC_000001.11:g.100007038C>T     NM_001271685.2:c.473C>T     NP_001258614.1:p.Thr158Met
NC_000001.11:g.100007038C>T     NM_012243.3:c.347C>T        NP_036375.1:p.Thr116Met
NC_000001.11:g.100007039G>A     NM_001271684.2:c.348G>A     NP_001258613.1:p.Thr116%3D
NC_000001.11:g.100007039G>A     NM_001271685.2:c.474G>A     NP_001258614.1:p.Thr158%3D

Заранее спасибо.

PS : file1 содержит уникальные записи. file2 отсортировано, разделено табуляцией и содержит более 3 миллионов записей.

Edit:

Под разделением табуляции я имел в виду то, что новый столбец добавляется как разделенный табуляцией, но значения внутри этого столбца разделены запятыми.

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Еще один awk. В вашем примере кода указано FS=OFS="\t", но выводится ", ", поэтому я использовал бывший последний. Кроме того, ожидаемый результат не достигается, поскольку только один элемент в file1 соответствует в file2.

$ awk '
BEGIN {
    FS=OFS="\t"                         # delims
}
NR==FNR {                               # process file1
    a[$0]                               # hash key only to see if values in file2
    next
}
($1 in a) {                             # if found in file1
    a[$1]=a[$1] (a[$1]==""?"":", ") $3  # append to the corresponding item
}
END {                                   # in the end
    for(i in a) 
        if(a[i]!="")                    # print all non-empty ones
            print i,a[i]
}' file1 file2

Вывод с вашими данными:

NC_000001.11:g.100007038C>T     NP_001258613.1:p.Thr116Met      NP_001258614.1:p.Thr158Met      NP_036375.1:p.Thr116Met
2 голосов
/ 05 мая 2020

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

awk '
BEGIN{
  OFS=", "
}
FNR==NR{
  array[$1]=(array[$1]?array[$1] OFS:"")$NF
  next
}
($1 in array){
  print $1"\t"array[$1]
}
'  Input_file2   Input_file1

Если вы хотите сохранить вывод в Input_file1, попробуйте следующее:

awk '
BEGIN{
  OFS=", "
}
FNR==NR{
  array[$1]=(array[$1]?array[$1] OFS:"")$NF
  next
}
($1 in array){
  print $1"\t"array[$1]
}
'  Input_file2   Input_file1 > temp && mv temp Input_file1

Пояснение: Добавление подробного объяснения приведенного выше кода здесь.

awk '                                                ##Starting awk program from here.
BEGIN{                                               ##Starting BEGIN section of this awk program from here.
  OFS=", "                                           ##Setting OFS as comma space here.
}
FNR==NR{                                             ##Checking condition FNR==NR which will be true when Input_file2 is being read.
  array[$1]=(array[$1]?array[$1] OFS:"")$NF          ##Creating array with index $1 and value is last field of line.
  next                                               ##next will skip all further statements from here.
}
($1 in array){                                       ##Checking condition if 1st field of current line is present in array then do following.
  print $1"\t"array[$1]                              ##Printing first column TAB and then value of array with index $1 here.
}
'  Input_file2  Input_file1                          ##Mentioning Input_file names here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...