2014-01-26 5 views
1

Я хочу сравнить 2-й столбец file2 с 1-м столбцом file1. Если они равны, я хочу добавить второй столбец file1 в file2, как показано на картинке output.txt.Сравните два файла разных столбцов и напечатайте разные столбцы

file2

chr5 ENST00000514151 utr5 0 + 
chr5 ENST00000512281 utr5 0 + 
chr5 ENST00000512281 utr5 0 + 
chr5 ENST00000512281 utr5 0 + 

file1

ENST00000512281 a 
ENST00000504031 b 
ENST00000776348 c 

output.txt

chr5 a ENST00000512281 utr5 0 + 
chr5 a ENST00000512281 utr5 0 + 
chr5 a ENST00000512281 utr5 0 + 

я смог сравнить файлы с

awk 'NR==FNR{a[$1];next}$2 in a{print}' file1 file2 

Это дает ниже вывод:

chr5 ENST00000512281 utr5 0 + 
chr5 ENST00000512281 utr5 0 + 
chr5 ENST00000512281 utr5 0 + 

Но я не знаю, как добавить 2-ую Колум из file1 на выход.

+0

Почему нет 'CHR5 б ENST00000504031 utr5 0 +' в требуемой мощности? –

+0

Спасибо @ Håkon Hægland, у меня есть 2 удаленные строки в файле2 – Marjer

ответ

2

Вы можете сохранить значение $2 в file1 в массиве, используя a[$1]=$2. Таким образом, вы можете попробовать:

awk ' 
    NR==FNR{ 
    a[$1]=$2 ; next } 
    $2 in a { 
    $1=$1 FS a[$2] 
    print 
    }' file1 file2 

Выход:

chr5 b ENST00000504031 utr5 0 + 
chr5 b ENST00000504031 utr5 0 + 
chr5 a ENST00000512281 utr5 0 + 
chr5 a ENST00000512281 utr5 0 + 
chr5 a ENST00000512281 utr5 0 + 

Объяснение:

  • Это изменяет $1 в file2 используя $1=$1 FS a[$2] где FS это поле по умолчанию Сепаратор, который является пространством .. и затем перестраивает запись, чтобы ее можно было напечатать print позже ..
  • print может быть упрощен до 1 при желании .. Как $2 in a { $1=$1 FS a[$2] }1
  • Обратите внимание, что это перестраивает запись в file2 и, таким образом, любые последовательности пробелов или вкладок будет обрезано до единого пространства в выходном сигнале , Чтобы сохранить исходное форматирование в file2 можно было бы использовать функцию split() в Gnu Awk версии 4 ..
+0

Привет @ Håkon Hægland, я получаю сообщение об ошибке при выполнении awk NR == FNR {a [$ 1] = $ 2; next} $ 2 в {$ 1 = $ 1 FS a [$ 2] print} 'file1 file2' не работает – Marjer

+0

Кажется, что вам не хватает точки с запятой перед 'print'. –

+0

Спасибо @ Håkon Hægland, что нужно сделать, если я хочу напечатать второй столбец файла 1 в output.txt в качестве третьего столбца. Любопытно – Marjer

Смежные вопросы