替换固定长度文件特定位置特定行中的字符串

替换固定长度文件特定位置特定行中的字符串

我有一个固定长度的数据文件,其中记录被标记(前 6 个字符具有标识记录的特定字符串),并且我需要替换特定行和该行上特定位置的文本。

HEADER   123456
SHIPTO   CODE    123 LANE     HOUSTON    TX
ITEM     ACME BRICK

例如,我想替换上述数据中的发货地址代码。数据可以在收货方记录的位置 10-17 中找到(以“SHIPTO”开头的行)。我想使用 sed 或 awk (或其他命令),但使用单个命令行更新数据。如果有多个 SHIPTO 线路,我可以全部更新。

答案1

使用 sed:

$ sed -E '/^SHIPTO/ s/(.{9}).{8}/\1NuValue /' file
HEADER   123456
SHIPTO   NuValue 123 LANE     HOUSTON    TX
ITEM     ACME BRICK

怎么运行的:

  • /^SHIPTO/

    这将选择以以下开头的行SHIPTO。这代替接下来的命令将仅应用于这些行。

  • s/(.{9}).{8}/\1NuValue /

    这将匹配该行的前 9+8 个字符,并将该行的前 9 个字符保存在组 1 中。这些字符将替换为组 1、\1和您的新值(为了保持格式,应为 8 个字符。

答案2

给定输入文件:

HEADER   123456
SHIPTO   CODE    123 LANE     HOUSTON    TX
ITEM     ACME BRICK

并希望更改“代码”后的字段,其中第一个字段是“SHIPTO”:

$ awk 'BEGIN { OFS = "\t" } $1 != "SHIPTO" { print } $1 == "SHIPTO" { $3="0000"; print }' input
HEADER   123456
SHIPTO  CODE    0000    LANE    HOUSTON TX
ITEM     ACME BRICK

如果您的字段是固定长度且以空格分隔且不是制表符分隔,则可以使用格式化的打印字符串(例如printf( "%20s\t" "$1" ))。

相关内容