awk:字段不打印到文件,但适用于stdout

时间:2014-03-20 19:00:26

标签: bash printing awk output

awk noob在这里。

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

我正在编写一个bash脚本,目的是创建一个包含四个字段的文件:subject,structure,side和volume,例如。

136     Hippocampus     Left     3450

我从主题特定的文件中抽取一堆标题行,然后是制表符分隔的大脑结构,卷和其他数据表。

12    17    3450    3450.7    Left-Hippocampus

脚本使用主题循环迭代这些文件,然后是结构和侧面,并且对于每个组合使用awk将$ side- $ struct与文件中的相应字段匹配,然后使用卷打印字段。然后它将所有数据回显到outfile。

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

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

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

当我在stdout中运行示例awk命令时,

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

它返回我想要的数字。

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

我看到人们谈论缓冲速度,我已经尝试过冲洗;我用cat喂了awk数据文件;我在尝试使用更多-v标志后,尝试从awk中打​​印所有变量;似乎没什么用。最终他们都做同样的事情,打印$ outfile中的前三列而不是第四列。

在此先感谢您的帮助,这让我疯了!这个剧本已经准备好运行一天了......

2 个答案:

答案 0 :(得分:2)

set命令没有按照您的意愿执行。

分配的Bourne shell语法只是

variable=value

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

所以,

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

另请注意脚本现在实际使用变量sidestruct

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

答案 1 :(得分:0)

试试这个

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

我删除了'='符号两侧的空格。我已经看到在为变量

赋值时,在等号周围有一个空格会引发错误