首页 > 解决方案 > awk 和shell 变量| 使用变化的变量

问题描述

假设我有一个循环(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 半新手,所以如果这甚至低于微不足道的水平,我深表歉意。

提前谢谢了。

标签: bashawk

解决方案


您正在处理文件 5 次。您看到的只是您处理文件的第 5 次,每次之前的迭代都会被下一次覆盖。

awk 可以自己处理:

  • 最简单的:awk '{print $0, NR}' file

  • 或使用计数器:awk '{print $0, ++n}' file- 如果您不想计算空行,您可能想要这样做:

    $ printf "%s\n" one two "" three "" four five | awk 'NF > 0 {$(NF+1) = ++n} 1'
    one 1
    two 2
    
    three 3
    
    four 4
    five 5
    

推荐阅读