如何在下面的示例中使用awk命令来存储值?

时间:2018-05-19 21:47:37

标签: awk

我希望根据以下文件中D位置67的值,从第68位到第81位求和:

10010001602171813800899901000000000101211000002007-05-130005316347D000000000000800 000000002007-05-18x?0000000000
10010001602171813800899901000000000201211000002007-05-130748402438C000000000000800 000000002007-05-18x?0000000000
10010001602171813800899901100000000101211000002007-05-130005316347D000000000000800 000000002007-05-18x?0000000000
10010001602171813800899901100000000201211000002007-05-130748402438C000000000000800 000000002007-05-18x?0000000000

我希望根据第67位的值C从第68位到第81位再获得一笔金额,即

s1 =1600 (based on D)
s2 =1600 (based on C)

我用过

grep "^1" file.txt | \
  awk '{s[substr($0,67,68-67)]+=substr($0,68,83-68)} 
       END { for (i in s) { print i, s[i] }}'

得到了总和

C 1596678
D 1596678

但我想将上述两个值存储在两个单独的变量中,例如A应该保持1596678而B应该保持1596678。

2 个答案:

答案 0 :(得分:1)

编辑: 由于OP告诉mapfile无效,因此请在此处输入其他命令。

numbers=$(grep "^1" | awk '{array[substr($0,67,1)]+=substr($0,68,15)+0} END{for(i in array){print i,array[i]}}')
for (( i=0; i<${#numbers[@]}; i++ )); do echo ${numbers[i]}; done

请你试试看,如果有帮助请告诉我。使用mapfileawk并在此处将值存储到数组中。

mapfile -t array1 < <(grep "^1" Input_file | awk '{array[substr($0,67,1)]+=substr($0,68,15)+0} END{for(i in array){print i,array[i]}}')

现在,如果你想看到数组的个别价值,你可以这样做:

echo "${array1[1]}"
D 160

echo "${array1[0]}"
C 160

注意: 如果来自awk的数组中有更多值,那么您不需要使用多个变量,因为数组应该处理它。如果您只需要整数值,那么也可以在上面的代码中从{print i,array[i]更改为{print array[i]

答案 1 :(得分:0)

所以..首先,数组元素是单独的变量。在awk脚本的END块中的任何位置,您都可以执行以下操作:

A=s["C"]
B=s["D"]

但是,如果不知道您的输入数据仅限于第67列中的这两个字符,您就无法知道要分配的变量数量。通常,使用不同的输入数据编写代码以灵活地编写代码并不是一个好主意,而不是假设您的数据总是具有特定内容。那&#34; C&#34;或&#34; D&#34;是数据的一部分,而不是架构

那就是......在原来的awk中修复数学,我想出了:

$ awk -v n=67 '
/^1/ {
  s[substr($0,n,1)]+=substr($0,n+1,15)
}
END {
  for(i in s) printf "%s %d\n",i,s[i]
}
' input.txt

这里的想法是n我们想要开始关注数据(即它提供数组的键),以下15个字符是要求的数字。

或者,如果您的awk实际上是gawk,则可以更清楚地将FIELDWIDTHS变量用于固定宽度字段:

$ gawk '
BEGIN{
  FIELDWIDTHS="66 1 15 1"
}
/^1/ {
  s[$2]+=$3
}
END {
  for(i in s) printf "%s %d\n",i,s[i]
}
' input.txt

根据您提供的输入数据,这两项结果均为:

C 1600
D 1600

请注意,我的解决方案与您的搜索结果相符(即每个$ 3的值为800),而不是您的问题(他们的值为8)。您可以根据需要随意将此解决方案调整为实际的字段宽度。