gpt4 book ai didi

awk - 如何使用 AWK 用空格右填充字段

转载 作者:行者123 更新时间:2023-12-04 12:14:24 24 4
gpt4 key购买 nike

我有一个文件,我试图从使用 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

这是我需要用虚构名称交换的客户名称,以便所需的输出是:
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

我有一个我想为此使用的转换器名称列表,存储在一个名为 transformer.names 的文件中。
SENTINEL PRIME
OPTIMUS PRIME
BUMBLEBEE
IRONHIDE

但是,为了使原始文件的每一行保持相同的宽度,我需要用空格右填充变压器名称,因为我拥有的变压器名称都是不同的长度。

似乎可以使用 AWK 将这些名称正确填充到一定长度,但我还没有设法弄清楚(或找到足够清晰的答案)让我理解。

下面是我当前的 AWK 脚本。
#!/usr/bin/awk -f
BEGIN {
}
{
getline line < "transformer.names"
print substr($0, 0, 30) line substr($0, 62, 120)
}

我用这个命令运行它:
my_program.awk my-file.txt

我想我可以包含这样的一行来代替上面的打印行,但是我还没有设法让它工作。
printf "-%32s|", substr($0, 0, 30) line substr($0, 62, 120)

任何提示都会很棒!

最佳答案

您需要申请%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

或者,您可以填充该字段,然后连接:
 print substr($0,1,30) sprintf("%-32s", newname) substr($0,62,120) 
# no commas except within the sprintf (and the substr's)

如果您的数据文件的行数比“transformernames”文件的行数多,那么您需要缓冲名称并重复循环它们,如 Ravinder 所示。

另外, substr awk 中的位置从 1 开始;如果您指定 0 或负数,则将其视为 1,但我认为实际说出您的意思更清楚,所以我解决了这个问题。 62 不是您发布的示例数据中客户名称后面部分的正确起始位置,但是您说数据仅与真实数据“非常相似”,所以我不知道是 56 还是 62 或其他什么是正确的。

关于awk - 如何使用 AWK 用空格右填充字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50979691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com