Сравнивая 2 столбца из разных файлов, выведите соответствующие столбцы - PullRequest
0 голосов
/ 28 февраля 2020

Я знаю, что были заданы похожие вопросы, которые побудили меня написать текущий код, но я все еще не могу получить правильный вывод. Вопрос: Если столбец 1 (в файле 1) соответствует столбцу 5 (в файле 2), выведите все столбцы в файле 2 и столбцы 3 и 4 (в файле 1) в новый файл.

Файл 1 (вкладка -delimited)

NJE_00001   rmf 6.2 Ribosome modulation factor
NJE_00002   rlm 7.1 Ribosomal RNA large subunit methyltransferase
NJE_00003   gnt 6.2 putative D-xylose utilization operon
NJE_00004   prp 4.1 2-methylisocitrate lyase

Файл 2 (с разделителями табуляции)

AFC_04390   rmf 5.6 protein1    NJE_00001
AFC_04391   rlm 2.5 protein54   NJE_00002
AFC_04392   gnt 2.1 protein8    NJE_00003
AFC_04393   prp 4.1 protein5    NJE_00004

Желаемый вывод (с разделителями табуляции)

AFC_04390   rmf 5.6 protein1    NJE_00001   6.2 Ribosome modulation factor
AFC_04391   rlm 2.5 protein54   NJE_00002   7.1 Ribosomal RNA large subunit methyltransferase
AFC_04392   gnt 2.1 protein8    NJE_00003   6.2 putative D-xylose utilization operon
AFC_04393   prp 4.1 protein5    NJE_00004   5.9 2-methylisocitrate lyase

Что я пробовал:

awk -F '\t' 'NR==FNR {a[$1]=$3"\t"$4; next} ($5 in a) {print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" a[$1]}' file1.tsv file2.tsv > file.out

awk -F '\t' 'NR==FNR {a[$1]=$2; next} {if ($5 in a) {print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" a[$1]}}' file1.tsv file2.tsv > file.out

awk -F '\t' 'NR==FNR {h[$1]=$3"\t"$4; next} ($5 in h) {print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" h[$1]}' file1.tsv file2.tsv > file.out

Все они выдали одинаковые результаты, идентичные файлу 2. Любая помощь будет принята с благодарностью! Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 февраля 2020

Пока ваши файлы отсортированы по первому и пятому столбцам соответственно, как в вашем примере, это легко сделать с помощью join

join -t$'\t' -11 -25 -o 2.1,2.2,2.3,2.4,2.5,1.3,1.4 file1.tsv file2.tsv > joined.tsv

Если не отсортировано, используйте <(sort -t$'\t' -k1,1 file1.tsv) и / или <(sort -t$'\t' -k5,5 file2.tsv) вместо просто имени файла в качестве аргументов join.

0 голосов
/ 28 февраля 2020
$ awk '
     BEGIN { FS=OFS="\t" }
     NR==FNR { a[$1]=$3 OFS $4; next }
     { print $0, a[$5] }
' file1 file2
AFC_04390       rmf     5.6     protein1        NJE_00001       6.2     Ribosome modulation factor
AFC_04391       rlm     2.5     protein54       NJE_00002       7.1     Ribosomal RNA large subunit methyltransferase
AFC_04392       gnt     2.1     protein8        NJE_00003       6.2     putative D-xylose utilization operon
AFC_04393       prp     4.1     protein5        NJE_00004       4.1     2-methylisocitrate lyase
0 голосов
/ 28 февраля 2020

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

awk '
FNR==NR{
  val=$1
  $1=$2=""
  sub(/^ +/,"")
  a[val]=$0
  next
}
($NF in a){
  print $0,a[$NF]
}
'  Input_file1  Input_file2

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

awk '                 ##Starting awk program from here.
FNR==NR{              ##Checking condition FNR==NR which will be TRUE when Input_file1 is being read.
  val=$1              ##Creating variable val which has $1 of current line.
  $1=$2=""            ##Nullifying first and second fields here.
  sub(/^ +/,"")       ##Substituting initial space with NULL in current line.
  a[val]=$0           ##Creating an array named a with index val and value of current line.
  next                ##next will skip further lines from here.
}
($NF in a){           ##Checking condition if $NF(last field of current line) is present in array a then do following.
  print $0,a[$NF]     ##Printing current line with array a with index $NF value.
}
' file1 file2         ##Mentioning Input_file names here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...