如果字段中有点,则awk打印列标题

时间:2017-04-19 12:48:13

标签: awk

在下面的tab-delimited file中,我尝试使用awk打印出字段的标题(如果它们包含单个.(点)。其他字段不应包含.,我将使用另一个awk来检测数据类型(alpha或整数---可能是十进制)。下面似乎很接近,但没有按预期工作。谢谢你:)。

文件

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

3 个答案:

答案 0 :(得分: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从第一行哈希获取标题信息,并在处理实际行时,如果遇到.,则获取哈希值数组中的值并打印出来。

答案 1 :(得分: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 ~ /./将为true。此外,$2 && $3 ~ ...将首先测试字段2的真实性(空字符串是假的),然后在字段3上进行匹配。

答案 2 :(得分: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