Использование awk для обновления некоторых столбцов файла с использованием столбцов другого файла на основе одного общего столбца - PullRequest
0 голосов
/ 12 марта 2020

Я хочу обновить файл file1.txt

ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  100003305   100003305   G   A   SOMATIC:Whole genome    1
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  100066996   100066996   G   A   SOMATIC:Whole genome    2
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  100186066   100186066   C   T   SOMATIC:Whole genome    3
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  100291988   100291988   C   G   SOMATIC:Whole genome    4
ALL PDXX1   doi:10.1038/nature  GRCh38  SNP 10  100411167   100411167   G   A   SOMATIC:Whole genome    5
ALL PDXX1   doi:10.1038/nature  GRCh38  SNP 10  100437011   100437011   C   T   SOMATIC:Whole genome    6
ALL PDXX1   doi:10.1038/nature  GRCh38  SNP 10  101056011   101056011   G   C   SOMATIC:Whole genome    7
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  101072576   101072576   G   C   SOMATIC:Whole genome; dbSNP v147    8
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  101127004   101127004   G   A   SOMATIC:Whole genome    9
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  101695339   101695339   G   A   SOMATIC:Whole genome    10

, используя file2.txt

10      200000000       200000000   5
10      300000000       300000000   6
10      400000000       400000000   7

Моя цель - получить этот выходной файл на основе общего последнего столбца из двух файлов и обновите 4-й, 6-й, 7-й, 8-й столбцы файла file1.txt, используя значения из file2.txt.

ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  100003305   100003305   G   A   SOMATIC:Whole genome    1
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  100066996   100066996   G   A   SOMATIC:Whole genome    2
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  100186066   100186066   C   T   SOMATIC:Whole genome    3
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  100291988   100291988   C   G   SOMATIC:Whole genome    4
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  200000000   200000000   G   A   SOMATIC:Whole genome    5
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  300000000   300000000   C   T   SOMATIC:Whole genome    6
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  400000000   400000000   G   C   SOMATIC:Whole genome    7
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  101072576   101072576   G   C   SOMATIC:Whole genome; dbSNP v147    8
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  101127004   101127004   G   A   SOMATIC:Whole genome    9
ALL PDXX1   doi:10.1038/nature  GRCh37  SNP 10  101695339   101695339   G   A   SOMATIC:Whole genome    10

Я попытался

 awk -F"\t" 'NR==FNR{a[$4];chr[$1];start[$2];end[$3];next}{if($12 in a) $4=a[$12]; $6=chr[$12]; $7=start[$12]; $8=end[$12]; print FILENAME " " NR " " FNR " " $0}' file2.txt file1.txt

Но пока не удалось.

1 Ответ

1 голос
/ 12 марта 2020

Я думаю, что решил это.

awk -F"\t" 'NR==FNR{a[$4]=$4;chr[$4]=$1;start[$4]=$2;end[$4]=$3;next}{if($12 in a) {OFS="\t"; $4="GRCh37"; $7=start[$12]; $8=end[$12]; print $0;} else {print $0}}' file2.txt file1.txt

Эта однострочная команда выводит обновленный file1.txt со столбцами из file2.txt.

Я хотел бы объяснить, что я делать здесь для людей, как я (которые являются новыми для awk). NR == FNR верно только для первого файла по своей природе ( Что такое NR и FNR и что означает "NR == FNR"? ).

Итак, мы получаем 4-й столбец file2.txt в массиве a. Я также сохраняю 1-й, 2-й и 3-й столбцы файла file2.txt в массивах chr, start и end.

next давайте перейдем ко второму файлу, который в нашем случае является file1.txt.

Для каждого значения в 12-м столбце file1.txt мы проверяем, находится ли это значение в a, если да, мы обновляем 4-й, 7-й и 8-й столбцы файла file1.txt с сохраненными значениями в массивах chr, start и end соответственно.

Мы сохранили значения в a, chr, start and end массивы, использующие $ 4 (используя значения строки, удовлетворенные в 4-м столбце) в качестве индекса. И позже мы получаем соответствующие значения, используя $ 12 (12-й столбец file1) в качестве индекса. Просто подумайте об этом, поскольку мы получаем сохраненные значения с помощью индексации в массивах.

Надеюсь, это будет полезно для других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...