簡體   English   中英

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 或 0/0,

然后寫“NA”標簽“NA”

別的

將兩個數字寫入以下字段,“數字 1”選項卡“數字 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($0,a,":"); print a[1]"\t"a[2]"\t"a[3]}' |
awk -F"\t" '{
    if ($1 == "0/0" || $1 == "1/1")
        print $1="NA", $2="NA"
    else
        print $2"\t"$3
}'

關於如何實現這一目標的任何想法?

提前非常感謝,喬治。

如果我正確理解了您的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

一種可能的解決方案:

 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

一個sed解決方案:

sed  's~\(0/0\|1/1\)[0-9:]\+~NA\tNA~g; s~./.:\([0-9]\+\)\:\([0-9]\+\)~\1\t\2~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' 開頭的第一個替換 NAs 字段
第二次替換從字段中分離並發出尾隨冒號分隔的數字

(整理輸出間距)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM