2017-04-19 36 views
0

tab-delimitedfile下面我試圖使用awk打印出字段的標題,如果它們包含單個.(點)。其他字段不應包含.,我將使用另一個awk來檢測數據類型(alpha或整數---可能是小數)。下面看起來很接近但沒有按預期工作。謝謝 :)。awk打印的列標題,如果字段中有點

文件

Index HGMD Sanger Classification  Pop 
1 . . VUS  .36 

AWK

awk -F'\t' '$2 && $3 ~ /./ && FNR == 1 {printf "dot detected in fields: ORS $0"}' file 
Index HGMD Sanger Classification 

期望的輸出

dot detected in fields: HGMD, Sanger 
+0

'.36'是一個記錄或兩個記錄? – Inian

+0

對不起,那是兩條記錄。基本上,'.'將會是自己的......它代表一個空值。 .36是代表'36%'的小數。謝謝 :)。 – Chris

回答

1

假設你希望有一個單一的點上的任何行(HGMDSanger這裏)列的標題:

Index HGMD Sanger Classification Pop 
1  .  2  VUS  .36 
1  .  .  VUS  .36 

一個解決辦法是:

awk -F'\t' 'NR==1 {for (i=0 ; i <= NF ; i++) headers[i] = $i; }  # 1 
    NR!=1 {for (i=0 ; i <= NF ; i++) if ($i == ".") dots[i] = 1} # 2 
    END { printf "Dots in fields: ";        
     for (x in headers) if (dots[x]) printf "%s ", headers[x]; # 3 
     printf "\n" 
} ' file 

(1)收集從第一個輸入行到數組headers的標題。 (2)在其他輸入行上,將該值與單個點進行比較,並將數組dots中的條目設置爲記錄任何找到的點。 (3)最後,用dots[i]集打印出列的標題。

輸出是Dots in fields: HGMD Sanger,即它們只列出一次。


圓點任何字符匹配正則表達式,所以$3 ~ /./程式碼中,如果場3包含的任何字符將是真實的。此外,$2 && $3 ~ ...將首先測試場2感實性(空字符串是falsy),然後執行比賽現場3

1

使用Awk如下

awk 'BEGIN{FS="\t"}NR==1{for(i=1;i<=NF;i++) header[i]=$i}{for(i=1;i<=NF;i++) { if (match($i,/^\.$/)) { print header[i] } } }' file 
HGMD 
Sanger 

的想法是獲得從第一行由索引1..n和處理實際線路時,如果碰到所.,得到從陣列和打印散列值散列標題信息它。

+2

如果($ i ==「。」)...'比較簡單一點,可以不用'match'。 – jas

+0

謝謝你們的幫助和解釋:)。 – Chris

1
awk ' 
NR==1 { split($0,hdr); next } 
{ 
    for (i=1; i<=NF; i++) { 
     if ($i != ".") { 
      delete hdr[i] 
     } 
    } 
} 
END { 
    printf "dot detected in fields" 
    for (i in hdr) { 
     printf "%s %s", (c++?",":":"), hdr[i] 
    } 
    print "" 
} 
' file 
dot detected in fields: HGMD, Sanger