awk 脚本未捕获哈希符号“#”

awk 脚本未捕获哈希符号“#”

如何让 awk 忽略以注释开头的记录,同时保留所有其他记录?下面的 awk 脚本不会忽略此示例测试文件中以哈希符号开头的记录。它还会跳过numpy记录。

测试文件
# Version numbers have been retrieved from a range of machines and environments.
# Take them with a grain of salt.

# Direct dependencies
#python==3.6.0
#pip==9.0.1
#setuptools==38.2.4  # old for MarkupSafe 1.0 (28.8.0 is installed with py 3.6)
numpy==1.12.1  # 1.12.0
pandas==0.19.2
awk脚本
#! /usr/bin/awk -f

BEGIN { 
  regex=/^[a-zA-Z]+\S+/ 
  n=0
}

$1 ~ regex {print $1; n++};

END{
  {print "\n# \n# End proccessing of "FILENAME" \n# Original file had "NR" records\n# Current file record count is "n};
  { if(NR>=n) print "#\n# Mattached all records"};
}
输出(忽略条)
|| #python==3.6.0
|| #pip==9.0.1
|| pandas==0.19.2
|| 
|| # 
|| # End proccessing of requirements.txt 
|| # Original file had 9 records
|| # Current file record count is 3
|| #
|| # Mattached all records

答案1

regex=/^[a-zA-Z]+\S+/意味着“比较结果$0并将/^[a-zA-Z]+\S+/结果保存在变量中regex”,因此regex分配的结果将为 1 或 0,并且由于我们处于BEGIN尚未读取任何行的部分,因此 $0 仍然为空,因此它相当于regex=0.

\S是一个 GNU awk 扩展,这意味着[^[:space:]]如果您使用 GNU awk - 它也支持强类型正则表达式常量(请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Strong-Regexp-Constants)。考虑到这一点,您可以这样做(注意符号@):

$ seq 5 | awk 'BEGIN{re=@/3/} $0 ~ re'
3

但仅限于 GNU awk。

在任何其他 awk 变体中(假设你说你正在使用版本,20070501我怀疑你正在使用 BSD 变体),你能做的最好的事情就是使用动态正则表达式:

$ seq 5 | awk 'BEGIN{re="3"} $0 ~ re'
3

答案2

这不是 awk 模式(看起来像 perl):

regex=/^[a-zA-Z]+\S+/ 

像这样的东西会起作用:

regex="^[a-zA-Z]+[^[:space:]]+"

另外,您的模式应该与$0(not $1) 匹配。 $0是整条线。 $1是第一个字段(将其视为第一个单词每行:可能没有#与第一列中的匹配)。

通过这两个更正,你的例子对我有用......

相关内容