打印添加到数字 awk 的数组元素



如果我有以下bash变量:

$ echo "${pos}"
201
719
744
205
354

以下产生...

!#bin/bash
(
    IFS=: 
    awk -v str2="$pos" -v sep="[$IFS]" '
        BEGIN {
            m = split(str2, b, sep)
            for (i=1; i<=m; ++i) {print b[i]}
        }
    '
)
-----------------
$ ./myscript.sh
201
719
744
205
354

但随后做

(
    IFS=: 
    awk -v str2="$pos" -v sep="[$IFS]" '
        BEGIN {
            m = split(str2, b, sep)
            for (i=1; i<=m; ++i) {print b[i]+10}
        }
    '
)
------
./myscript.sh
211

所以添加是有效的,但不能打印所有元素的结果。 为什么不呢?

您有一个包含以下内容的变量pos

201
719
744
205
354

大概你的意图是每一行都应该成为数组中的一个值,即值用换行符分隔。然后,您有代码说:

IFS=: 
awk -v str2="$pos" -v sep="[$IFS]" '
    BEGIN {
        m = split(str2, b, sep)

因此,通过IFS=: ... sep="[$IFS]" ... split(...,sep),您告诉 awk 在每次出现:时拆分pos,而不是在每次换行时拆分。结果是数组b只包含 1 个条目,即变量 pos 的全部内容。所以在上面,m1和你的循环:

for (i=1; i<=m; ++i) {print b[i]}

循环一次,只打印b[1]整个字符串:

201
719
744
205
354

当你对此进行算术以添加1时,awk 会剥离从第一个非数字到字符串末尾的所有内容(就像每次对包含前导数字后非数字的字符串进行数字运算时所做的那样)并将 1 加到剩下的内容上,这样你就会得到201 + 1 = 202

您需要在脚本中设置IFS=$'n'而不是IFS=':',但不清楚为什么以这种方式编写脚本。我认为您可能混淆了如何将外壳数组的内容传递给awk以及如何将shell变量的值传递给awk。另外,顺便说一句,舍邦是写#!,而不是!#

以下是在awk中初始化和打印数组内容的方法:

$ pos="201
719
744
205
354"
$ awk -v str2="$pos" '
BEGIN {
    m = split(str2, b)
    for (i=1; i<=m; ++i) {
        print b[i], "+ 1 =", b[i]+1
    }
}'
201 + 1 = 202
719 + 1 = 720
744 + 1 = 745
205 + 1 = 206
354 + 1 = 355

或者,如果您真的只想在换行符上拆分:

$ IFS=$'n'
$ awk -v str2="$pos" -v sep="$IFS" '
BEGIN {
    m = split(str2, b, sep)
    for (i=1; i<=m; ++i) {
        print b[i], "+ 1 =", b[i]+1
    }
}'
201 + 1 = 202
719 + 1 = 720
744 + 1 = 745
205 + 1 = 206
354 + 1 = 355

与你所拥有的相比:

$ IFS=':'
$ awk -v str2="$pos" -v sep="$IFS" '
BEGIN {
    m = split(str2, b, sep)
    for (i=1; i<=m; ++i) {
        print "<" b[i] "> + 1 =", b[i]+1
    }
}'
<201
719
744
205
354> + 1 = 202

听起来很奇怪。我试图重现您的问题,但没有成功。您确定数组的内容吗?
你也可以用另一种方式迭代你的数组:

for i in {1..5}; do echo $i; done | awk '{a[$0]=$0}END{for(i in a) print a[i]+10 }'

对我有用,我希望它能解决你的问题。

最新更新