объединение и обработка двух файлов, разделенных табуляцией, в awk и создание нового - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть 2 tab separated файлы с 2 столбцами.column1 1 - это номер, а column 2 - это ID.как эти 2 примера:

пример файла1:

188 TPT1
133 ACTR2
420 ATP5C1
942 DNAJA1

пример файла1:

91  PSMD7
2217    TPT1
223 ATP5C1
156 TCP1

Я хочу найти общие строки 2 файлов на основе столбца 2 (ID столбца) и создайте новый файл с разделителями табуляцией, в котором есть 4 столбца: column1 - это ID (общий идентификатор)(что означает log2 (column2 / column3)).например, в отношении идентификатора «TPT1»: 1-й столбец - TPT1, столбец 2 - 188, столбец 3 - 2217, а столбец 4 - log2 (188/2217), что равно -3,561494.Вот ожидаемый вывод:

Ожидаемый вывод:

TPT1    188 2217    -3.561494
ATP5C1  420 223 0.9133394

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

awk 'NR==FNR { n[$2]=$0;next } ($2 in n) { print n[$2 '\t' $1] '\t' $1 '\t' log(n[$1]/$1)}' file1.txt file2.txt  > result.txt

thisкод не возвращает то, что я ожидаю.ты знаешь как это исправить?

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Я бы использовал join для фактического объединения файлов вместо awk:

$ join -j2 <(sort -k2 file1.txt) <(sort -k2 file2.txt) |
   awk -v OFS="\t" '{ print $1, $2, $3, log($2/$3)/log(2) }'
ATP5C1  420 223 0.913346
TPT1    188 2217    -3.5598

Программа join, ну, объединяет два файла с общим значением.Это требует, чтобы файлы были отсортированы на основе столбца соединения, но ваши примеры этого не делают, следовательно, встроенные sort файлы данных.Затем его выходные данные передаются в awk для вычисления log2 чисел каждой строки и получения результатов, разделенных табуляцией.


Альтернатива с использованием perl, которая дает вам большую точность по умолчанию, если вы заботитесь об этом (И не хочу связываться с CONVFMT переменной awk):

$ join -j2 <(sort -k2 a.txt) <(sort -k2 b.txt) |
   perl -lane 'print join("\t", @F, log($F[1]/$F[2])/log(2))'
ATP5C1  420 223 0.913345617745818
TPT1    188 2217    -3.55980420318967
0 голосов
/ 06 февраля 2019

awk + метод сортировки

 awk ' { print $0,FILENAME }' ellyx.txt ellyy.txt | sort -k2 -k3 | awk ' {c=$2;if(c==p) { print c,a,$1,log(a/$1)/log(2) }p=c;a=$1 } '

с заданными входами

$ cat ellyx.txt
188 TPT1
133 ACTR2
420 ATP5C1
942 DNAJA1

$ cat ellyy.txt
91  PSMD7
2217 TPT1
223 ATP5C1
156 TCP1

$ awk ' { print $0,FILENAME }' ellyx.txt ellyy.txt | sort -k2 -k3 | awk ' {c=$2;if(c==p) { print c,a,$1,log(a/$1)/log(2) }p=c;a=$1 } '
ATP5C1 420 223 0.913346
TPT1 188 2217 -3.5598

$
0 голосов
/ 06 февраля 2019
$ awk -v OFS="\t" 'NR==FNR {n[$2]=$1;next} ($2 in n) {print $2, $1, n[$2], log(n[$2]/$1)/log(2)}' file1 file2 
TPT1    2217    188  -3.5598
ATP5C1  223     420  0.913346
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...