【问题标题】:setting split array to empty in awk在 awk 中将拆分数组设置为空
【发布时间】:2013-11-01 00:58:11
【问题描述】:

我有以下文件

Hello. this is an example
    Car=toyota Fruit=Orange Name=John
    01
    Car=toyota Fruit=Orange Name=John
    02
    Car=toyota Fruit=Orange Name=John
    03
End of the file

我在 shell 中运行这个 awk 代码

awk -F "\t" '{n=split($2,a); for(i=1 ; i<=n ; i++) {if(a[i] ~ "^Fruit*") a[i]=""} print}' myFile.txt

所以字段分隔符是tab。然后我使用space 拆分第二个字段。如果我的任何子字段(以空格分隔)以Fruit 开头,我想删除它。

这不起作用。它不会删除它。


预期输出

Hello. this is an example
    Car=toyota Name=John
    01
    Car=toyota Name=John
    02
    Car=toyota Name=John
    03
End of the file

请不要使用额外的软件包。我希望它尽可能默认。 (使用 awk,sed,grep 会很棒)

【问题讨论】:

  • 显示您的预期输出,可能有更好的方法。
  • @anubhava 我已经编辑了问题:)

标签: bash awk


【解决方案1】:

如果我的任何子字段(由空格分隔)以 Fruit我要删除。

你可以使用sed:

$ sed 's/Fruit=[^ ]* //g' inputfile
Hello. this is an example
    Car=toyota Name=John
    01
    Car=toyota Name=John
    02
    Car=toyota Name=John
    03
End of the file

【讨论】:

  • @devnull 这很好用。但为什么它对名称不起作用???我尝试sed 's/Name=[^ ]* //g' inputfile 并且名称不会被删除?
  • @Matin 如果Name 是文件中的最后一个字段,您需要说:sed 's/Name=.*//g' inputfile
  • @Matin 它对Name 不起作用的原因是,通过说/Name=[^ ]* /(注意* 后面的空格),您也在尝试匹配空格,这可能不存在,因为它是最后一个字段。
  • @Matin:使用 sed 's/Name=[^ ]* *//g'
  • @Matin 使用第二个;阿努巴瓦建议的那个。如果您从行的中间删除一个字段,它不会留下额外的空间。
【解决方案2】:
awk   '{gsub(/ Fruit[^ ]*/,"")}1' myFile.txt

给予:

Hello. this is an example
    Car=toyota Name=John
    01
    Car=toyota Name=John
    02
    Car=toyota Name=John
    03
End of the file

【讨论】:

  • 不能使用gsub:/对不起
  • 这将替换行中任意位置的Fruit 字符串,而不仅仅是第二个字段。
  • @anubhava,来自 OP:If any of my subfields (which are separated by space) starts with Fruit I want to delete it
  • @perreal:读Then I split the Second field using space之前的一句话
  • @Matin - 如果您的 awk 不支持 gsub() 那么您使用的是旧的、损坏的 awk,这将使您的生活变得痛苦,试图解决它的不足和特质,并在各种情况下神秘地失败。您在 /usr/bin/awk 中的默认 awk 是旧的、损坏的 awk 的 Solaris 上吗?如果是这样,请切换到 nawk 或 /usr/xpg4/bin/awk。否则 - 在你使用的 awk 完全破坏你的数据之前,你必须得到一个现代的 awk。
【解决方案3】:
$ cat file                                                          
Hello. this is an example
    Car=toyota ForeName=John Name=JohnSmith 
    01
End of the file

$ sed -r 's/(^|[[:space:]])ForeName=[^[:space:]]+[[:space:]]*/\1/' file
Hello. this is an example
    Car=toyota Name=JohnSmith 
    01
End of the file

$ sed -r 's/(^|[[:space:]])Name=[^[:space:]]+[[:space:]]*/\1/' file    
Hello. this is an example
    Car=toyota ForeName=John 
    01
End of the file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多