【问题标题】:Awk: field not printing to file, but works to stdoutawk:字段不打印到文件,但适用于标准输出
【发布时间】:2014-04-27 20:52:18
【问题描述】:

这里是新手。

从根本上说,我有一个以 {print $4} 结尾的 awk 命令,当它被输入到 echo > file 命令时,它不会打印所请求字段的值。输出为空白。

我正在编写一个 bash 脚本,目标是创建一个包含四个字段的文件:主题、结构、侧面和体积,例如

136     Hippocampus     Left     3450

我正在从带有一堆标题行的特定主题文件中绘制,然后是一个制表符分隔的大脑结构、体积和其他数据表。

12    17    3450    3450.7    Left-Hippocampus

脚本遍历这些文件,循环遍历主题,然后是结构和边,并且对于每个组合,使用 awk 将 $side-$struct 与文件中的适当字段匹配,然后打印带有卷的字段。然后它将所有数据回显到输出文件。

set volume = `awk -v side="$side" -v struct="$struct" '$5 ~ /$side-$struct/ {print $4}' filename.stats

echo "${subj}    ${struct}    ${side}    ${volume}" >> $outfile

但是,该文件始终显示前三列的适当值,但从不显示音量值;该列是空白的。

当我在标准输出中运行示例 awk 命令时,

awk '$5 ~ /Left-Hippocampus/ {print $4}' filename.stats

它返回我想要的数字。

为什么脚本不能正确打印到 $outfile 卷数据以及循环变量的数据?

我看到人们谈论缓冲速度,我尝试过刷新;我已经用 cat 喂给了 awk 数据文件;在用进一步的 -v 标志声明它们之后,我尝试从 awk 打印所有变量;似乎没有任何效果。最终他们都做同样的事情,打印 $outfile 中的前三列而不是第四列。

提前感谢您的帮助,这让我发疯了!该脚本实际上已经准备好运行一天多...

【问题讨论】:

  • 尝试类似 echo "${subj} ${struct} ${side} ${volume} Hello" >> $outfile?也许音量变量是空的?

标签: bash printing awk output


【解决方案1】:

set 命令并没有达到您的预期。

赋值的 Bourne shell 语法很简单

variable=value

没有空格(如果值需要包含空格,请使用引号)。

所以,

volume=$(awk -v side="$side" -v struct="$struct" '$5 ~ (side "-" struct) {print $4}' filename.stats)

还要注意变量 sidestruct 现在是如何被脚本实际使用的。

但是,我想知道您是否不应该改为在 Awk 中进行所有处理。

【讨论】:

    【解决方案2】:

    试试这个

    volume=`awk -v side="$side" -v struct="$struct" '$5 ~ /$side-$struct/ {print $4}' filename.stats
    echo "${subj}    ${struct}    ${side}    ${volume}" >> $outfile
    

    我已删除“=”符号两侧的空格。我已经看到,在为变量赋值时,等号周围有一个空格会引发错误

    【讨论】:

    • 你不应该使用旧的反抽,使用括号var=$(code)。三人组的帖子。
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2011-08-21
    • 2015-08-31
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2012-06-29
    • 2019-03-29
    相关资源
    最近更新 更多