使用 awk/sub 命令替换字符串中的字符

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

我有一个具有图 1 中结构的输入文件。该文件混合了描述字符。

到目前为止,我有以下代码,在第 2 行执行以下操作。

  1. 使所有描绘字符相同

  2. 批号大写为2569TESTLOT

  3. 用空格替换第一次出现的下划线。

  4. 用下划线替换第二次出现的空格。

awk -F "\t" '
            { sub(/\015/,"",$NF) }  # remove CRs
    NR == 1 { next }
    NR == 2 { OFS = "\t";   # needed to replace spaces
              $4 = toupper($4); # conv lot no. to uppercase
              gsub(/ /,"_",$0);
              sub(/_/," ",$1);
              OFS = " "; print }
    NR == 3 { next }
    NR > 3  { print }
  ' $inpfile >| $tmpfile

我正在寻找的所需输出具有以下格式。

FP5A FP202 LD_BENCH LIFT 2569TESTLOT.....

但是,上面代码的结果是

FP5A FP202_LD 台式举升机 2569 测试台.....

我的问题是双重的。

  1. 如何使用 awk 结构中的 sub 命令替换特定位置的字符?

  2. 为什么 toupper 命令不将批号大写?

我正在使用 Cygwin 运行此 ksh 代码。我已经尝试过阅读 ksh 脚本指南,但仍然不知所措。

shell unix awk ksh
1个回答
0
投票

为什么 toupper 命令不将批号大写?

根据图1第4个字段持有

LOT
,而
2569testlot
位于第5个字段,所以如果你愿意,你应该瞄准后者
2569TESTLOT

如何使用 sub 替换特定位置的字符 awk 结构中的命令?

根据 GNU Awk 用户指南

sub(regexp, replacement [, target])

搜索目标,被视为字符串,查找与正则表达式 regexp(...) 匹配的最左边、最长的子字符串

因此,在使用

sub
时,除了第一次出现之外,您无法选择任何其他内容

© www.soinside.com 2019 - 2024. All rights reserved.