【问题标题】:unix: get all numeric values, including non-integersunix:获取所有数值,包括非整数
【发布时间】:2017-08-02 00:34:54
【问题描述】:

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

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}' 但我只得到 ​​p>

VAR1    VAR2    VAR3    VAR4
ID2     foo     1       1

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

【问题讨论】:

    标签: unix awk numeric


    【解决方案1】:

    如何鞠躬:

    $ 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第三个字段乘以一还是一样的值

    【讨论】:

    • 谢谢,它就像一个魅力。即使我后来意识到有些值是科学计数法
    【解决方案2】:

    尝试关注,如果这对您有帮助,请告诉我。

    awk 'NR==1{print;next} $3 !~ /[a-zA-Z]/' Input_file
    

    awk 'NR==1{print;next} $3 ~ /[0-9]/'  Input_file
    

    【讨论】:

    • 谢谢,对于我最初提供的示例,它们都工作得很好,但后来我意识到我的数据在科学记数法中有一些价值。
    • 第一个会错误匹配:-),而第二个会错误匹配Joe90
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多