【问题标题】:Using awk to remove spaces from a field使用 awk 从字段中删除空格
【发布时间】:2013-07-14 22:24:55
【问题描述】:

在寻找我的答案时,我遇到了这个:

removing a space from a string by awk

但我未能成功地将此处的信息推断为我的情况。

我目前有一些数据格式如下:

Host Name="Host Name Here"
Product Name="Product Name Here"
Program Name="Program Name Here"

我只是想删除第一个字段中的空格,因此结果将如下所示:

HostName="Host Name Here"
ProductName="Product Name Here"
ProgramName="Program Name Here"

使用此代码会删除所有字段中的所有空格:

awk 'BEGIN {FS=" "; OFS=""} {for(i=1;i<=NF;++i) {out = out OFS $i}} END {print out;}'

据我了解,这只是寻找空格作为字段分隔符并打印出来,空格替换为空字符串,这不是我想要的。

我认为我需要使用 awk,并且我必须将字段分隔符设置为 =,然后应用类似这样的东西,也许吧??

awk '$1 ~ /[ \t]/ {gsub(/[ \t]/,"",$1)1}

据我非常有限的理解,它将查看字段 1,如果它包含模式 [\t],将使用 gsub 将该空间替换为空字符串。不过,我认为我的语法在这里并不完全正确。

【问题讨论】:

    标签: awk gsub


    【解决方案1】:

    使用=作为字段分隔符(用于输入和输出)并从第一个字段中删除空格:

    awk -F= -v OFS="=" '{gsub(/[[:blank:]]/, "", $1); print}' << END
    Host Name="Host Name Here"
    Product Name="Product Name Here"
    The Program Name="Program Name Here"
    END
    
    HostName="Host Name Here"
    ProductName="Product Name Here"
    TheProgramName="Program Name Here"
    

    【讨论】:

    • 这正是我试图到达的地方。很高兴知道我很接近,至少。
    【解决方案2】:

    如果您只有单个空格,最简单的方法是使用sed

    $ sed 's/ //' file
    HostName="Host Name Here"
    ProductName="Product Name Here"
    ProgramName="Program Name Here"
    

    使用GNU sed,您可以使用-i 选项将更改存储回文件:

    $ sed -i 's/ //' file
    

    如果您在= 之前可能有两个以上用空格分隔的单词,您可以使用awk 执行以下操作:

    $ awk '{sub(/ /,"",$1)}1' FS="=" OFS="=" file
    HostName="Host Name Here"
    ProductName="Product Name Here"
    ProgramName="Program Name Here"
    

    【讨论】:

    • 谢谢。这行得通。我不明白为什么这个 sed 命令没有遍历整行并替换所有空格。
    • 这对于带有多个空格的第一个字段将失败。 sed 很难修复它。
    • 进一步检查,Birei是对的。我还注意到它执行的第一行的奇怪行为......
    • @Birei 好点,没有想到这一点,似乎并非如此,但无论如何添加了一个解决方案。 @dsclough 是 sed 的默认行为,用于删除您将使用 g 标志 (global) 的所有事件。
    • @sudo_O:是的。我会为您提供快速的awk 修复+1。我第一眼就想到了。在这种情况下,它似乎更加自然和恰当。
    【解决方案3】:
    awk '{print $1$2,$3,$4}' file
    HostName="Host Name Here"
    ProductName="Product Name Here"
    ProgramName="Program Name Here"
    

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      相关资源
      最近更新 更多