Заменить значения на основе условия и сравнить значения из нескольких файлов с AWK - PullRequest
2 голосов
/ 10 июля 2020

Я потратил день, пытаясь понять это, но безуспешно. У меня есть два таких файла:

File1:

chr id pos
14 ABC-00 123
13 AFC-00 345
5  AFG-99 988

File2:

index id chr
1 ABC-00 14
2 AFC-00 11
3 AFG-99 7

Я хочу проверить, имеет ли значение chr в файле 1! = Из chr в файле 2 для того же идентификатора, если это правда, я хочу напечатать несколько столбцов из обоих файлов, чтобы получить результат, подобный приведенному ниже.

Ожидаемый выходной файл:

ID OLD_chr(File1) NEW_chr(File2)
AFC-00 13 11
AFG-99 5 7
.....

Total number of position changes: 2

I есть одно предостережение. В файле 1 я должен заменить некоторые значения в столбце $ 1 перед сравнением файлов. Примерно так:

30 and 32 >> X
31 >> Y
33 >> MT

Потому что в файле 2 эти значения кодируются именно так. А затем сравните два файла. Как, черт возьми, я могу этого добиться?

Я пытался перекодировать файл 1:

awk '{ 

        if($1=30 || $1=32) gsub(/30|32/,"X",$1);
        if($1=31) gsub(/31/,"Y",$1);
        if($1=33) gsub(/33/,"MT",$1);
  
        print $0
  
    }'  File 1 > File 1 Recoded

И я пытался сопоставить столбцы и распечатать результат с помощью:

awk 'NR==FNR{a[$1]=$1;next} (a[$1] !=$3){print  $2, a[$1], $3 }' File 1 File 2  > output file

Ответы [ 2 ]

2 голосов
/ 10 июля 2020
$ cat tst.awk
BEGIN {
    map[30] = map[32] = "X"
    map[31] = "Y"
    map[33] = "MT"
    print "ID", "Old_chr("ARGV[1]")", "NEW_chr("ARGV[2]")"
}
NR==FNR {
    a[$2] = ($1 in map ? map[$1] : $1)
    next
}
a[$2] != $3 {
    print $2, a[$2], $3
    cnt++
}
END {
    print "Total number of position changes: " cnt+0
}

.

$ awk -f tst.awk file1 file2
ID Old_chr(file1) NEW_chr(file2)
AFC-00 13 11
AFG-99 5 7
Total number of position changes: 2
1 голос
/ 10 июля 2020

Вот так:

awk '
    BEGIN{                                         # executed at the BEGINning
        print "ID OLD_chr("ARGV[1]") NEW_chr("ARGV[2]")"
    }
    FNR==NR{                                       # this code block for File1
        if ($1 == 30 || $1 == 32) $1 = "X"
        if ($1 == 31)             $1 = "Y"
        if ($1 == 33)             $1 = "MT"
        a[$2]=$1
        next
    }
    {                                              # this for File2
        if (a[$2] != $3) {
            print $2, a[$2], $3
            count++
        }
    }
    END{                                           # executed at the END
        print "Total number of position changes: " count+0
    }
' File1 File2

ID OLD_chr(File1) NEW_chr(File2)
AFC-00 13 11
AFG-99 5 7
Total number of position changes: 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...