【发布时间】:2021-04-01 15:05:21
【问题描述】:
假设我有一个循环(bash shell),结构如下:
for iter in `seq 1 to 5`
do
<bunch of stuff that generates a file called test.dat>
awk -v var="$iter" '{print $1 " " var}' test.dat > mod_test.dat
done
我不太明白为什么 awk 没有写出 $iter 变量的当前值。
例如,test.dat 可能看起来像(比如说)
abcd
efgh
ijkl
mnop
我期待着结束
abcd 1
efgh 2
ijkl 3
mnop 4
[基本上,我只是想将循环计数器放在每一行的末尾。]
但是,我的脚本不起作用,因为输出文件 (mod_test.dat) 很简单
abcd 5
efgh 5
ijkl 5
mnop 5
换句话说,它只是将计数器的最后一个值附加到每一行。我知道计数器正在工作(循环中的 echo $iter 显示它正在递增)。
我做错了什么明显的事情?我已经尝试了所有我知道的技巧来设置 awk 变量(var=$iter, var="$iter", var="$iter"....),但没有成功。我是一个 awk 半新手,所以如果这甚至低于微不足道的水平,我们深表歉意。
非常感谢。
【问题讨论】:
-
您能否在这里更清楚地说明您要实现的目标,因为如果您只是想打印越来越多的数字,您可以在
awk中完成。另请注意:您的 seq 命令应为seq 1 5。 -
另外,
test.dat > mod_test.dat用 awk 的最后一次迭代输出覆盖目标文件(这也可能不是您想要的)。使用>>追加到目标文件。 -
是的 - 输入 seq 代码的错误。感谢您指出。我想将计数器附加到文件每一行的末尾。我不明白为什么目前的代码只是添加了计数器的最后一个值。
-
为什么是代码:第一次迭代:
var=1和 awk 处理文件中的每条记录并输出到目标文件。第二次迭代,var=2和 awk 处理文件中的每条记录并输出到目标文件。等等。丢失 bash 循环并仅使用awk '{print $0,NR}' file是最快的解决方法。 -
相对于
Use grep to find the line in the listing containing value I need. Use awk to pull the value from that line,- 当您使用 awk 时,您永远不需要 grep。grep 'foo' | awk '{bar}'=awk '/foo/{bar}'.