awk命令或sed命令
在上面的文件中,我们有头和尾,以1开头的记录是详细记录awk命令或sed命令,awk,sed,Awk,Sed,在上面的文件中,我们有头和尾,以1开头的记录是详细记录 在详细记录中,要使用awk/sed命令对从位置28到44的值进行求和,包括符号使用awk我们可以使用以下方法解决此问题: substr(s,m[,n]): 返回从位置m开始的s的至多n个字符的子字符串,从1开始编号。如果省略了n,或者n指定的字符多于字符串中的剩余字符,则子字符串的长度应受到字符串s长度的限制 这允许我们获取表示数字的字符串。在此,我假设数字前后的符号相同,因此数字的符号为: 000Bxxxxx111118064085vxa
在详细记录中,要使用awk/sed命令对从位置28到44的值进行求和,包括符号使用
awk
我们可以使用以下方法解决此问题:
substr(s,m[,n])
:
返回从位置m
开始的s
的至多n
个字符的子字符串,从1开始编号。如果省略了n
,或者n
指定的字符多于字符串中的剩余字符,则子字符串的长度应受到字符串s
长度的限制
这允许我们获取表示数字的字符串。在此,我假设数字前后的符号相同,因此数字的符号为:
000Bxxxxx111118064085vxas - header
10000000001000000000053009-000000000053009-
10000000005000000000000000+000000000000000+
10000000030000000004025404-000000004025404-
10000000039000000000004930-000000000004930-
10000000088000005417665901-000005417665901-
90000060883328364801913 - trailer
由于awk
在对字符串执行数字操作时会隐式地将字符串转换为数字,因此我们可以编写以下awk
-代码以实现请求的:
$ echo "10000000001000000000053009-000000000053009-" \
| awk '{print length($0); print substr($0,27,43-27)}'
43
-000000000053009
或者在一行中:
$ awk '/header|trailer/{next}
{s+=substr($0,27,43-27)}
END{print s}' file.dat
-5421749244
上述示例仅适用于OP给出的示例文件。但是,如果您有一个包含多个具有标题
和尾部
的块的文件,并且您只想使用这些块内的文本(排除块外的所有内容),那么您应该稍微不同地处理它:
$ awk '/header|trailer/{next}{s+=substr($0,27,43-27)} END{print s}' file.dat
-5421749244
我们在这里做以下工作:
- 如果找到带有
,则将块和标题的行
重置为s
,并设置零
,表明我们考虑了下一行c=1
- 如果找到带有
的行,则将块和trailer
添加到总和s
中,并设置s
以指示忽略这些行c=0
- 如果
计算块和c/=0
s
- 在
,打印总金额末尾
S
$ awk '/header/{s=0;c=1;next}
/trailer/{S+=s;c=0;next}
c{s+=substr($0,27,43-27)}
END{print S}' file.dat
我假设
+/-
符号跟在数字后面。您能否澄清您的预期输出,并向我们展示您迄今为止所做的尝试?欢迎来到Stack Overflow!对不起,这不是StackOverflow的工作方式。形式为“我想做X,请给我提示和/或示例代码”的问题被认为是离题的。请访问和读取,尤其是读取wan,以汇总特定输出文件或输出文件中的字段。此外,为什么只有awk/sed?谢谢,但我显示的数据位于文件中,并且是此awk的新数据,因此需要帮助来辅助其中的文件。用文件名替换
,这样就可以了。请注意,这仅假设单个块头、尾
cat file1.dat |'/头|尾/{next}{s+=substr($0,27,44-28)}结束{print s}'file1.dat.sumbal对于上面提到的示例文件,但当我使用由609655条记录组成的真实文件时,它显示为零…使用这些awk命令时是否存在记录计数限制?
sed -rn '
/header|trailer/! {
s/[[:digit:]]*[+-]([[:digit:]]+)([+-])$/\2\1/
H
}
$ {
x
s/\n//gp
}
' file | bc