【问题标题】:How do I extract a single value from a tab-separated table in bash?如何从 bash 中的制表符分隔表中提取单个值?
【发布时间】:2015-11-11 16:45:19
【问题描述】:

我正在尝试从 LabelID 1 (117.96) 中提取最大值。

LabelID        Mean        StdD         Max         Min       Count     Vol(mm^3)        Extent(Vox)
0      20.99750    56.25956  1606.19238   -15.53062     2073413   3591156.654    144   144   100
1      98.31916     7.77291   117.95876    81.89870         110       190.520     11    15     6
3     131.89938    10.77435   154.69934   111.26049          77       133.364     11    12     4

我尝试过使用c3d $image $ROI -lstat | awk ‘{print $22}’,但它返回一个空行。 Cut 产生类似的结果。

【问题讨论】:

  • 最大值是 190.520,而不是 117。
  • 首先,了解 awk 如何查看您的数据。试试...|awk '{print $0}'。您确定要字段22 吗?或尝试$4。祝你好运。
  • 对不起,我的意思是 Max 列,而不是 LabelID 1 行中的最大值。我尝试了 awk '{print $0}' 并且也返回了一个空行。 4 美元产生了类似的结果。这是什么意思?
  • @AbrahamBrownell, ...我还建议使用set -x 运行您的实际脚本,以查看它调用c3d 的实际命令行,并与您在手动测试期间使用的命令行进行比较;如果您有一个具有令人惊讶的值的变量,那可能是原因。
  • 同意@shellter;不清楚您为什么要针对字段 $22 - 几乎看起来您是从文件开头而不是每行开头开始计算字段。

标签: bash


【解决方案1】:

只要说:

$ awk '$1==1{print $4}' file
117.95876

即当第一列为1时,打印第四列。

【讨论】:

    【解决方案2】:
    #!/bin/bash
    target_label=1
    target_column=3 # first column is 0, so fourth is 3
    
    while read -r -a columns; do                   # read a line into an array
      if [[ ${columns[0]} = $target_label ]]; then # check label id
        echo "${columns[target_column]}"           # print the column we want
        break                                      # and exit the loop
      fi
    done <infile                                   # redirect input for that full block
    

    当然,&lt;infile 可以替换为 &lt; &lt;(your command goes here) 以从命令的输出而不是文件中读取流。

    如果您只想接受制表符,而不是任何其他类型的空格,请将其设为while IFS=$'\t' read -r -a columns。如果您不想合并多个连续的文字标签,请参阅read in bash on tab-delimited file without empty fields collapsing

    【讨论】:

    • 漂亮的解决方案!我不知道 OP 想要做什么,但这真是太好了:)
    • 我猜这个问题除了bash 之外没有任何标签,但与仅使用 cut / awk 相比似乎大惊小怪。
    • 取决于 OP 实际在做什么;如果想要在正在读取的文件和 shell 状态/变量内容等之间进行实际交互,那么额外的冗长是值得的。我假设这里的echo 只是一个用于更有趣逻辑的占位符。
    • (...如果我不打算将其用作占位符,我会使用更强大的 printf '%s\n' "${columns[3]}" 代替)。
    猜你喜欢
    • 2019-10-01
    • 2017-03-17
    • 2016-09-20
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多