在下面的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
答案 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)
假设您希望列的标题在任何行(HGMD
和Sanger
)上都有一个点:
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