我想在第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
答案 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的条件,没有声明。这是“打印这条线”的简写。