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中的前三列而不是第四列。
在此先感谢您的帮助,这让我疯了!这个剧本已经准备好运行一天了......
答案 0 :(得分:2)
set
命令没有按照您的意愿执行。
分配的Bourne shell语法只是
variable=value
没有空格(如果值需要包含空格,则使用引号)。
所以,
volume=$(awk -v side="$side" -v struct="$struct" '$5 ~ (side "-" struct) {print $4}' filename.stats)
另请注意脚本现在实际使用变量side
和struct
。
但是,我想知道你是不是应该在Awk中进行所有处理。
答案 1 :(得分:0)
试试这个
volume=`awk -v side="$side" -v struct="$struct" '$5 ~ /$side-$struct/ {print $4}' filename.stats
echo "${subj} ${struct} ${side} ${volume}" >> $outfile
我删除了'='符号两侧的空格。我已经看到在为变量
赋值时,在等号周围有一个空格会引发错误