使用 awk 替换固定位置文件中的字段值

问题描述 投票:0回答:3

这里的要求是将位置 9-12 替换为空白,例如,在所有固定大小的记录中。

我用过

cat file | awk '{sub(substr($0,9,12),"   ",$0);print}'

有效,除非前面有空白 9. 尝试像这样指示分隔符

cat file | awk -F"*" '{sub(substr($0,9,12),"   ",$0);print}'

没有帮助。这里正确的语法是什么?

awk text-processing
3个回答
1
投票

示例文件:

$ cat file
1234567890123456
1234567 90123456
1234567890123456
1234567 90123456
1234567890123456

一个

awk
想法:

awk '{ print substr($0,1,8) "    " substr($0,13) }' file

注意事项:

  • 这会将第 9-12 个位置的 each 替换为空格(即将 4 个字段替换为总共 4 个空格)
  • 如果打算用一个空格替换 4 个字段,则将
    "    "
    替换为
    " "

这会生成:

12345678    3456
1234567     3456
12345678    3456
1234567     3456
12345678    3456

使用相同的思想动态处理仓位(类似于评论中Cyrus的建议):

awk -v start=9 -v end=12 '{ print substr($0,1,start-1) sprintf("%*s",(end-start+1)," ") substr($0,end+1) }' file

这也会生成:

12345678    3456
1234567     3456
12345678    3456
1234567     3456
12345678    3456

1
投票

根据您显示的尝试,请尝试遵循 GNU

awk
代码。在
match
程序中使用
awk
函数,其中使用正则表达式
(^.{8}).{4}(.*$)
创建 2 个捕获组,并将值包含到数组 arr 中,然后打印数组 arr 的第一个和第二个元素。

awk '
match($0,/(^.{8}).{4}(.*$)/,arr){
  print arr[1]"    "arr[2]
}
' Input_file

0
投票

使用 GNU AWK

$ awk -v from=9 -v to=12 'BEGIN{FS=OFS=""}{for(i=from;i<=to;i++) $i=" "}1' file
© www.soinside.com 2019 - 2024. All rights reserved.