我希望根据以下文件中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。
答案 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
请你试试看,如果有帮助请告诉我。使用mapfile
和awk
并在此处将值存储到数组中。
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
)。您可以根据需要随意将此解决方案调整为实际的字段宽度。