首页 > 解决方案 > 根据条件替换值并使用 AWK 比较来自多个文件的值

问题描述

我花了一天的时间试图解决这个问题,但没有成功。我有两个这样的文件:

文件1:

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

文件2:

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

我想检查文件 1 中 chr 的值是否 != 来自文件 2 中的 chr 是否具有相同的 ID,如果这是真的,我想从两个文件中打印一些列以得到如下所示的输出。

预期的输出文件:

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

Total number of position changes: 2

我有一个警告。在文件 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

标签: linuxawksed

解决方案


像这样:

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

推荐阅读