awk命令或sed命令

awk命令或sed命令,awk,sed,Awk,Sed,在上面的文件中,我们有头和尾,以1开头的记录是详细记录 在详细记录中,要使用awk/sed命令对从位置28到44的值进行求和,包括符号使用awk我们可以使用以下方法解决此问题: substr(s,m[,n]): 返回从位置m开始的s的至多n个字符的子字符串,从1开始编号。如果省略了n,或者n指定的字符多于字符串中的剩余字符,则子字符串的长度应受到字符串s长度的限制 这允许我们获取表示数字的字符串。在此,我假设数字前后的符号相同,因此数字的符号为: 000Bxxxxx111118064085vxa

在上面的文件中,我们有头和尾,以1开头的记录是详细记录
在详细记录中,要使用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

这里是sed,在bc的帮助下完成算术:

$ 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