我有一个文件,我试图从使用 AWK 中去除客户名称。该文件是一个固定宽度的文件,每一列都有含义。
该文件由许多行组成,格式相同,非常类似于以下内容:
1234-123 123456 12345678901234CUSTOMER NAME TO REMOVE12345-1234 TRN 123-123 12345678901-1234 TRN 12345678
1234-123 123456 12345678901234CUSTOMER NAME TO REMOVE12345-1234 TRN 123-123 12345678901-1234 TRN 12345678
1234-123 123456 12345678901234CUSTOMER NAME TO REMOVE12345-1234 TRN 123-123 12345678901-1234 TRN 12345678
1234-123 123456 12345678901234CUSTOMER NAME TO REMOVE12345-1234 TRN 123-123 12345678901-1234 TRN 12345678
Run Code Online (Sandbox Code Playgroud)
这是我需要用虚构名称交换的客户名称,以便所需的输出是:
1234-123 123456 12345678901234SENTINAL PRIME 12345-1234 TRN 123-123 12345678901-1234 TRN 12345678
1234-123 123456 12345678901234OPTIMUS PRIME 12345-1234 TRN 123-123 12345678901-1234 TRN 12345678
1234-123 123456 12345678901234BUMBLE BEE 12345-1234 TRN 123-123 12345678901-1234 TRN 12345678
1234-123 123456 12345678901234IRON HIDE 12345-1234 TRN 123-123 12345678901-1234 TRN 12345678
Run Code Online (Sandbox Code Playgroud)
我有一个我想为此使用的变压器名称列表,存储在一个名为transformer.names.
SENTINEL PRIME
OPTIMUS PRIME
BUMBLEBEE
IRONHIDE
Run Code Online (Sandbox Code Playgroud)
但是,为了保持原始文件的每一行具有相同的宽度,我需要用空格右填充变压器名称,因为我拥有的变压器名称的长度都不同。
似乎可以使用 AWK 将这些名称正确填充到一定长度,但我还没有设法弄清楚(或找到足够清晰的答案)让我理解。
下面是我当前的 AWK 脚本。
#!/usr/bin/awk -f
BEGIN {
}
{
getline line < "transformer.names"
print substr($0, 0, 30) line substr($0, 62, 120)
}
Run Code Online (Sandbox Code Playgroud)
我用这个命令运行它:
my_program.awk my-file.txt
Run Code Online (Sandbox Code Playgroud)
我想我可以包含这样的一行来代替上面的打印行,但是我还没有设法让它工作。
printf "-%32s|", substr($0, 0, 30) line substr($0, 62, 120)
Run Code Online (Sandbox Code Playgroud)
任何提示都会很棒!
你需要应用%Ns到要垫不整线的具体领域,你需要做负(对leftpad / rightalign)的说明符的一部分,也printf作为不会自动加入一行/记录分隔print这样做你需要补充一点:
printf "%s%-32s%s\n", substr($0, 1, 30), newname, substr($0, 62, 120)
# note commas; this is a format string containing three specifiers,
# and separate three data values used for those three specifiers
Run Code Online (Sandbox Code Playgroud)
或者,您可以填充该字段,然后连接:
print substr($0,1,30) sprintf("%-32s", newname) substr($0,62,120)
# no commas except within the sprintf (and the substr's)
Run Code Online (Sandbox Code Playgroud)
如果您的数据文件的行数比“transformernames”文件的行数多,那么您需要缓冲名称并重复循环它们,如 Ravinder 所示。
此外,substrawk 中的位置从 1 开始;如果您指定 0 或负数,则将其视为 1,但我认为实际说出您的意思更清楚,所以我解决了这个问题。62 不是您发布的示例数据中客户名称后面部分的正确起始位置,但是您说数据仅与真实数据“非常相似”,所以我不知道是 56 还是 62 或其他什么是正确的。