unix:获取所有数值,包括非整数

时间:2017-08-01 14:57:49

标签: unix awk numeric

我有一个制表符分隔的文件,其中缺失值用点表示。例如:

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

我还想在不同的文件中保存不匹配的行(即非数字且不丢失)。

2 个答案:

答案 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