【问题标题】:Increment array by 1 in awk在 awk 中将数组递增 1
【发布时间】:2017-01-20 14:39:43
【问题描述】:

我尝试使用 awk 用“if”将数组加一:

inf_a='1.0'
inf_b='4.0'
inf=($(seq $inf_a 1.0 $inf_b))

gro_a='0.0'
gro_b='4.0'
gro=($(seq $gro_a 0.5 $gro_b))

tri_a='1'
tri_b='12'
tri=($(seq $tri_a 1 $tri_b))

# counter
declare -A succ
declare -A fail
num_inf=${#inf[@]}
num_gro=${#gro[@]}
num_tri=${#tri[@]}

for ((i=1;i<num_inf;i++)) do
    ii=${inf[$i]}

    for ((j=1;j<num_gro;j++)) do
    jj=${gro[$j]}

        for ((k=1;k<num_tri;k++)) do
            kk=${tri[$k]}
            awk 'END{x=($2+$8);if($x<10) (( fail[$i,$j]++ )) ;else (( succ[$i,$j]++ )) }' infect$ii/$jj/trial$kk/out.dat
        done
        echo
    done
done
printf '%s\n' "fail[1,1]"
printf '%s\n' "succ[1,1]"

但是,它们都返回 0。看来问题源于 (( array[x,y]++ ))。 “++”似乎不起作用。

有什么建议吗?我错过了什么?

谢谢。

已编辑:

这是我的 out.dat 的一个例子

47990   1451    234803  25  9816    2   593 1478    245212  605053  999.999695
47991   1451    234811  25  9806    2   593 1478    245210  605618  1000.010071
47992   1451    234821  25  9810    2   592 1478    245223  605928  1000.000610
47993   1450    234828  25  9812    2   593 1477    245233  605786  1000.003357
47994   1450    234826  25  9837    2   588 1477    245251  605642  1000.017029
47995   1450    234837  25  9832    2   588 1477    245257  605191  1000.104919
47996   1449    234849  26  9830    2   589 1477    245268  605350  1000.089966
47997   1449    234856  26  9831    2   588 1477    245275  605260  999.999695
47998   1447    234852  26  9834    2   589 1475    245275  605122  1000.124512
47999   1447    234838  26  9852    2   590 1475    245280  605124  999.999695

编辑: 用这种方式修改代码似乎行不通。

declare $( awk 'BEGIN{print "let "s=s+1""}' )

【问题讨论】:

  • 问题源于尝试不当使用shell。 shell 是一个调用工具的环境,而不是一个操作文本的工具。整个事情应该在单个 awk 脚本中更简单、清晰、稳健和高效地完成。
  • 你能给我们举个你out.dat的例子吗?
  • chw21 :文件现已添加。感谢您的建议。

标签: arrays bash shell awk


【解决方案1】:

你的脚本有一些问题。

  1. $i$j 是一个 bash 变量。 awk 不会知道他们的价值观。您必须使用-v 将它们的值导出到awk

  2. 那么,fail[]succ[]awk 数组。 bash 如何知道这些值?要么您在 awk 中打印它们的值,然后使用 $() (Command substitution) 在 bash 中获取它并使用它。

参考以下链接:

How to use shell variables in an awk script

http://tldp.org/LDP/abs/html/commandsub.html

【讨论】:

  • 如果我尝试将值传递给 awk,然后更改 bash 值,我应该查看哪个方向?
  • @Simon,抱歉,我无法理解你的问题。
  • 您的答案中的第一个链接仅讨论了如何在 awk 中打印 shell 变量。但我需要的是改变 awk 中的变量值。我想知道它是否以同样的方式工作。
  • @Simon,它应该可以工作。例如:i=2; out=$(awk -v svar=$i '{svar+=1; print $1, svar}' file) .
  • 我尝试为我的代码更改它,但代码仍然返回 0。out=$(awk -v svar=$s '{svar+=1; print $1, svar}' infect$ii /$jj/trial$kk/out.dat)
猜你喜欢
  • 1970-01-01
  • 2022-11-19
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
相关资源
最近更新 更多