向列添加值并在输出中保持相同的文件格式

时间:2018-02-19 20:00:46

标签: bash awk

我想在第2列substr($ 0,11,5)中添加一些常量值。我使用简单的代码获得了所需的输出。

还有其他选择吗?。

输入文件

X  9367      211L  36829.00  47705.001 7561 77761  37260.00  47706.00  48136.001
X  9367     1101L  36829.00  47717.001 7771 79921  37260.00  47706.00  48148.001
X  9367     1201L  36829.00  47729.001 7981 82081  37260.00  47706.00  48160.001
X  9367     2491L  36829.00  47741.001 8191 84241  37260.00  47706.00  48172.001

使用的代码

awk '{print substr($0,1,10) substr($0,11,5)+60000 substr($0,16,65)}' file

输出所需

X  9367   600211L  36829.00  47705.001 7561 77761  37260.00  47706.00  48136.001
X  9367   601101L  36829.00  47717.001 7771 79921  37260.00  47706.00  48148.001
X  9367   601201L  36829.00  47729.001 7981 82081  37260.00  47706.00  48160.001
X  9367   602491L  36829.00  47741.001 8191 84241  37260.00  47706.00  48172.001

3 个答案:

答案 0 :(得分:1)

使用Perl,你可以说:

perl -pe 's/^(.{10})(.{5})/$1 . ($2 + 60000)/ge' file

顺便说一句,你的计算存在疑问 以第一行为例,您将添加60000到21而不是211,并在总和的末尾添加“1L”。这就是你想要的吗?

答案 1 :(得分:1)

通过查看您想要的输出,我相信以下内容可能对您有帮助。

awk '{$3=sprintf("6%06s",$3)} 1'   Input_file

输出如下:

X 9367 600211L 36829.00 47705.001 7561 77761 37260.00 47706.00 48136.001
X 9367 601101L 36829.00 47717.001 7771 79921 37260.00 47706.00 48148.001
X 9367 601201L 36829.00 47729.001 7981 82081 37260.00 47706.00 48160.001
X 9367 602491L 36829.00 47741.001 8191 84241 37260.00 47706.00 48172.001

答案 2 :(得分:1)

传统的Awk缺乏处理固定宽度字段的任何内置工具。多年来,许多人都对缺乏scanf()函数感到遗憾,这种函数会使awk与其他语言处理此类事物相提并论。

GNU awk,如果你有,它有一个FIELDWIDTHS变量,可以让你避免将你的输入分成FS,而是使用..固定宽度字段。

所以:

#!/usr/local/bin/gawk -f

BEGIN {
  FIELDWIDTHS="1 6 8 2 10 11 5 6 10 10 11"
  OFS=""
}

{
  $3=sprintf("%" length($3) "d",$3+60000)
}

1

请注意,gawk仍会使用OFS来分隔固定宽度字段,因此您需要将其设置为空字符串以避免间隔出来。

此外,如果您只关心一个字段,并且每行的所有其他字段都相同,您可以选择将各个字段捆绑在一起:

  FIELDWIDTHS="7 8 65"
...
  $2=sprintf("%" length($2) "d",$2+60000)

此外,sprintf()是必需的,因为向$3添加整数的行为会删除否则将包含的空格。 FIELDWIDTHS变量仅用于读取行,它不用于打印它。即使字段宽度发生变化,length()的笨拙使用也会使该线适应。如果您希望它更漂亮,您可以将该格式字符串压缩为"%8d"

哦,如果你不熟悉它,最后的1是一个总是返回true的条件,没有声明。这是“打印这条线”的简写。