我有一个制表符分隔的文件,其中缺失值用点表示。例如:
VAR1 VAR2 VAR3 VAR4
ID1 foo 0.1 0.1
ID2 foo 1 1
ID3 foo foo .
ID4 foo foo foo
ID5 foo . 1
ID6 foo -0.1 -0.1
ID7 foo -1 -1
ID8 foo 5e-08 5e-08
我需要提取第三列中的值为数字(包括非整数,负值,科学记数法)或缺失的所有行。所以我的输出应该是这样的:
VAR1 VAR2 VAR3 VAR4
ID1 foo 0.1 0.1
ID2 foo 1 1
ID5 foo . 1
ID6 foo -0.1 -0.1
ID7 foo -1 -1
ID8 foo 5e-08 5e-08
到目前为止,我已尝试在awk中使用
awk -F"\t" 'BEGIN{OFS="\t"} ( $3 ~ /^[[:alnum:]]+$/ ) {$1=$1; print}'
然后我才得到
VAR1 VAR2 VAR3 VAR4
ID2 foo 1 1
我还想在不同的文件中保存不匹配的行(即非数字且不丢失)。
答案 0 :(得分:4)
如何弓箭:
$ awk '$3*1==$3 || $3=="." || NR==1' file
VAR1 VAR2 VAR3 VAR4
ID1 foo 0.1 0.1
ID2 foo 1 1
ID5 foo . 1
ID6 foo -0.1 -0.1
ID7 foo -1 -1
说明:
NR==1
我们正在处理标题记录||
或$3=="."
第三个字段是句号||
或$3*1==$3
第三个字段乘以一个仍然是相同的值答案 1 :(得分:2)
尝试关注并告诉我这是否对您有所帮助。
awk 'NR==1{print;next} $3 !~ /[a-zA-Z]/' Input_file
OR
awk 'NR==1{print;next} $3 ~ /[0-9]/' Input_file