【问题标题】:Matching non-whitespace in a field匹配字段中的非空白
【发布时间】:2015-03-01 01:26:12
【问题描述】:

在下面的数据中,我想正确区分缩进的行。每行包含 2 个以制表符分隔的字段,因此每个缩进的行都以不可见的制表符开头。

我想知道为什么下面测试第一个字段中的非空白的脚本只打印下面粘贴的数据的第二个和倒数第二个字段,而不是所有未缩进的行。欢迎提出解决方案的建议,但我想知道我写的内容有什么问题。

这是脚本

BEGIN {FS="\t"; OFS="\t"}
  /\s*(directors)\s*$/ {type=$1; next}
  $1~/\S/ {print}

数据。

directors
&Oumlzkul, Ahmet Salih  Ii 2013
'Abd Al-Hamid, Ja'far   A Two Hour Delay 2001
    Badgeless sur la Croisette 2012
    Just Outside the Frame: The Profilmic Event and Beyond 2008
    Mesocafe 2009
    Mesocafé 2011
'D.J'Arlia, Domenic She'll Never Know 2012
    Cantarella 2011
    Makhno Beer 2010
'Kid Niagara' Kallet, Harry Drug Demon Romance 2012
'Kusare, Mak (I)    Baby Beautiful 2013/II
    Comrade 2008
'Kusare, Mak (II)   A Play Called a Temple Made of Clay 2014
'Legend' Spivey, Larry  The Crime City Diaries: Entry 1 - Crooked 2012
'Noble Julz'Hamilton, Ulia  Church Hurt 2015

【问题讨论】:

  • 发布您的预期输出。 \s 等也是 gawk 特有的,你在使用 gawk 吗?
  • 正如所指出的,常规 awk 中的\S 只是一个大写“S”,实际上您得到的结果(第二行和倒数第二行)正是带有“S”的结果在第一个领域。正如@EdMorton 建议的那样,我用gawk 尝试了你的脚本,它运行良好。我还用常规的 awk 尝试了@anubhava 的答案,效果很好。如果它不适合您,也许可以使用您从@anubhava 的答案创建的脚本文件的内容来更新您的问题。
  • @Ed Morton。我刚刚意识到我最近切换了机器,并且 man awk 显示我正在运行 mawk。
  • 已经在新机器上安装了gawk,脚本现在没有改变,一切都很好。

标签: regex awk


【解决方案1】:

使用 posix 正则表达式属性而不是 PCRE \s\S

awk 'BEGIN {FS=OFS="\t"}
   /[[:space:]]*directors[[:space:]]**$/ {type=$1; next}
   $1~/[^[:space:]]/' file

注意使用[[:space:]] 代替\s[^[:space:]] 代替\S

【讨论】:

  • 我以 awk -f yourScript myfile 运行它,但它没有打印任何内容。