【问题标题】:How to remove leading and trailing " , remove leading and trailing spaces from each row each field in ksh如何删除前导和尾随 " ,从 ksh 中的每个字段的每一行中删除前导和尾随空格
【发布时间】:2016-09-20 13:52:36
【问题描述】:

我在 ksh 脚本中有很多函数(经常使用 gawk),它们对文件进行很多计算。文件被管道删除。 但是现在我的源文件发生了变化。现在文件中的每个字段都包含在双引号中,如下所示。 另外,如果有的话,我必须修剪前导和尾随空格或制表符。

Old_Myfile.txt

Name|Designation|emlid
Alex|Software Design Engg|E0023
Corner|SDE|E0056

New_Myfile.txt

"Name"|"Designation"|"emlid"
"Alex"|"Software Design Engg"|" E0023"
"      Corner  "|"      SDE"|" E0056 "

请提出与我已经编写的脚本兼容的方法。

【问题讨论】:

  • HuMMM,你的代码在哪里?
  • 您引用的字段可以包含|s 吗?例如"Alex"|"Software | Design | Engg"|" E0023".

标签: unix awk ksh gawk


【解决方案1】:

sed

$ sed 's/ *" *//g' file

Name|Designation|emlid
Alex|Software Design Engg|E0023
Corner|SDE|E0056

也可以在awk 脚本中组合而无需此额外步骤。

【讨论】:

    【解决方案2】:

    此脚本可能针对您的需要进行了过度设计,但它会单独对每个字段进行操作(在 for 循环中),以防您以后需要添加其他逻辑。

    BEGIN{
      FS="|";
      OFS="|";
    }
    
    {
      for(i=1; i<=NF; i++){
        gsub(/(^"[ ]*|[ ]*"$)/, "", $i);
    
        if (i == NF) {
          printf("%s\n", $i);
        }
        else {
          printf("%s%s", $i, OFS);
        }
      }
    }
    

    这是输出

    $ awk -f /tmp/script.awk </tmp/input.txt
    Name|Designation|emlid
    Alex|Software Design Engg|E0023
    Corner|SDE|E0056
    

    【讨论】:

    • gsub(/(^"[ ]*|[ ]*"$)/, "", $i);
    • 我已经使用了这个解决方案。 gsub(/(^"[ ]*|[ ]*"$)/, "", $i);这给出了以下结果:如果字段两侧都有空格,它只会修剪一侧,即前导空格。我不得不将脚本修改为: gawk -F "|" ' {OFS="|" } { for (i=1;i
    • 你为什么把gsub改成subgsub 将“全局”替换每一行的每次出现。这比有两个 for 循环更可取,每个循环都执行sub 操作。此外,gawk -F "|"gawk 'BEGIN{FS="|"...' 之间没有区别。只是指出,以防你不知道。至于您的正则表达式,请尝试将其包装在括号中,以包装提供的正则表达式。另外我不确定您为什么需要修改脚本。帖子中的输出是您期望的输出,对吗?缺少哪些边缘案例?愿意提供这些吗?
    【解决方案3】:

    如果您引用的字段不能包含|s,那么在您现有的 awk 脚本中将其添加为第一行:

    awk '
    { gsub(/[[:space:]]*"[[:space:]]*/,"") }
    <existing script>
    '
    

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 2020-08-20
      • 2011-10-15
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多