【问题标题】:gawk split on pattern傻瓜分裂模式
【发布时间】:2017-10-14 12:51:05
【问题描述】:

我正在尝试按模式拆分字符串。 字符串看起来像这样

"Table 4. Kings County" 

"Table 984. Los Angles County" 

所需的数组将是

"Table 4","Kings","County"
"Table 984","Los Angles","County" 

我试过这样的

echo "Table 4. Kings County"  | gawk '{patsplit($0,a,/Table [[:digit:]]./s); print a[1]}'

但并没有真正起作用

【问题讨论】:

  • design-patterns - 请不要在有关文本模式匹配的问题上使用此标签。 Tag Info
  • 没有意识到我这样做了。一定是搞错了。
  • 你的意思是“县”?模式是表[编号]。县名县
  • gawk 标记的访问次数远少于awk 标记,因此为了让更多人查看您的问题以帮助您,请使用 @ 标记您的 awk 问题987654328@,如果您愿意,可以选择添加gawk 标签,并在您的问题中说明您正在使用 gawk。

标签: regex text-processing gawk


【解决方案1】:

gawk 带有gensub 函数的解决方案:

awk '{$0=gensub(/(Table [0-9]+)\. (.*) (County)/,"\\1\042,\042\\2\042,\042\\3","g",$0); print $0}' file

输出:

"Table 4","Kings","County" 
"Table 984","Los Angles","County"

gensub() 提供了 sub() 或 gsub() 中不可用的附加功能:指定一个正则表达式 替换文本。这是通过在正则表达式中使用括号来完成的 标记组件,然后在替换中指定'\N' 文本,其中 N 是从 1 到 9 的数字。

\042 - 双引号 " 的八进制代码


要考虑替换最多 County 字,请使用以下附加方法:

awk '{$0=gensub(/(Table [0-9]+)\. (.*) (County).*/,"\\1\042,\042\\2\042,\042\\3\042","g",$0); print $0}' file

【讨论】:

  • 谢谢。这很有用。我怎样才能只到县?表 4 种类县等等。我只想让内容达到“县”
  • @NinjaGaiden,要考虑替换到 County 字使用我的附加方法
【解决方案2】:

如目前所示,该问题似乎与 sed 的功能非常匹配:

$ sed -E 's/([[:digit:]])[.] */\1","/; s/ *(County") *$/","\1/' file
"Table 4","Kings","County"
"Table 984","Los Angles","County"

它是如何工作的:

  • s/([[:digit:]])[.] */\1","/

    此替换将"." 放在表号之后

  • s/ *(County") *$/","\1/

    这种替换将"," 放在最后的County 之前。

【讨论】:

  • 谢谢。在 awk 中需要它,因为我正在 awk 中进行其他处理
【解决方案3】:
awk '{sub(/\. /,"\",\"")sub(/ C/,"\",\"C"); $0=$0}NF=NF' file

"Table 4","Kings","County"
"Table 984","Los Angles","County"

【讨论】:

    【解决方案4】:

    sed

    sed -r 's/(Table [0-9]+)\. (.*) (County)/\1","\2","\3/'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2012-07-18
      • 2011-10-12
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多