AWK 遍历多列

AWK Loop Over Multiple Columns

请假设我有以下情况(多列和多行):

1/1:123:121 TAB 0/0:1:21 TAB 1/1:12:14
0/1:12:23 TAB 0/1:12:15 TAB 0/0:123:16
0/0:3:178 TAB 1/1:123:121 TAB 1/1:2:28

想要的是 awk 遍历每一列并在这些条件下写入新的输出:

如果第一个字段(由“:”分隔)是 1/1 OR 0/0,

然后写“NA”TAB“NA”

其他

将两个数字写入以下字段,“数字 1”TAB“数字 2”。列之间的分隔符应为 TAB。

因此,上面使用的示例所需的输出为:

NA TAB NA TAB NA TAB NA TAB NA TAB NA
12 TAB 23 TAB 12 TAB 15 TAB NA TAB NA
NA TAB NA TAB NA TAB NA TAB NA TAB NA

下面是我当前的代码,适用于第一列,但我不知道如何让它适用于文件中的所有列。

awk '{split([=12=],a,":"); print a[1]"\t"a[2]"\t"a[3]}' |
awk -F"\t" '{
    if ( == "0/0" ||  == "1/1")
        print ="NA", ="NA"
    else
        print "\t"
}'

关于如何实现这一点有什么想法吗?

非常感谢,乔治。

一种可能的解决方案:

 awk '{ for(i=1; i<=NF; i++){split($i,a,","); if (a[1] == "0/0" || a[1] == "1/1") {printf " ""NA"" ""NA"} else {printf " "a[2]" "a[3]}} print""}' | cut -d " " -f2- > Test.txt

如果我对你的 TAB 的理解正确,请你试试:

awk -F"\t" '{
    for (i = 1; i <= NF; i++) {
        split($i, a, ":")
        if (a[1] == "0/0" || a[1] == "1/1") a[2] = a[3] = "NA"
        printf "%s\t%s%s", a[2], a[3], i == NF ? "\n" : "\t"
    }
}' input_file

其中 input_file 看起来像:

1/1:123:121     0/0:1:21        1/1:12:14
0/1:12:23       0/1:12:15       0/0:123:16
0/0:3:178       1/1:123:121     1/1:2:28

和输出:

NA      NA      NA      NA      NA      NA
12      23      12      15      NA      NA
NA      NA      NA      NA      NA      NA

你可以使用这个awk:

awk -v OFS='\t' -F '[:\t]' '{
   s = ""
   for (i=1; i<=NF; i+=3)
      s = (s == "" ? "" : s OFS) ($i == "0/0" || $i == "1/1" ? "NA" OFS "NA" : $(i+1) OFS $(i+2))
   print s
}' file

NA  NA  NA  NA  NA  NA
12  23  12  15  NA  NA
NA  NA  NA  NA  NA  NA

一个 sed 解决方案:

sed  's~\(0/0\|1/1\)[0-9:]\+~NA\tNA~g; s~./.:\([0-9]\+\)\:\([0-9]\+\)~\t~g' dat.tab  

NA  NA  NA  NA  NA  NA
12  23  12  15  NA  NA
NA  NA  NA  NA  NA  NA

以“0/0”或“1/1”开头的第一个替换 NA 字段
第二次替换从字段

中分离并发出尾随冒号分隔的数字

(整理了输出间距)