多模式awk

多模式awk,awk,if-statement,Awk,If Statement,我的文件看起来像: L 0 256 * * * * * H 0 307 100.0 + 0 0 S 30 351 * * * * * D 8 27 * * * * 99.3 C 11 1 * * * * * 对于我的脚本,我想从awk开始,使用$1为某些行打印$0 比如 awk '{if ($1!="C") {print $0} else i

我的文件看起来像:

L   0   256 *   *   *   *   *
H   0   307 100.0   +   0   0
S   30  351 *   *   *   *   *
D   8   27  *   *   *   *   99.3    
C   11  1   *   *   *   *   *   
对于我的脚本,我想从awk开始,使用$1为某些行打印$0

比如

awk '{if ($1!="C") {print $0}  else if ($1!="D") {print $0}}'
但是,必须有一种方法将“C”和“D”组合成一个IF语句。。。对吧?


例如,如果我想搜索==L,H,S即。。。不是C或D我如何纠正这一点?

您目前的状况不正确,因为两者都是
$1=“C”
$1=“D”
不能同时为false。因此,它将始终打印整个文件

这将按照您描述的方式进行:

awk '{if ($1!="C" && $1!="D") {print $0}}'  file

使用awk,您可以使用语法为特定模式提供规则

awk 'pattern {action}' file
awk'/regular expression/ {action}' file
有关模式的定义,请参见。在您的例子中,可以使用正则表达式作为语法模式

awk 'pattern {action}' file
awk'/regular expression/ {action}' file
一个适合你需要的基本正则表达式可以是

awk '/^[^CD]/ {print $0}' file
你可以把它缩短成

awk '/^[^CD]/' file

因为
{print$0}
是默认操作,正如注释中所建议的那样。

这个语法为什么会如此“精简”或精简?这种类型的脚本被称为其他类型的脚本吗?如果是这样,我喜欢学习它的规则。非常感谢。没什么特别的。Awk由{}段组成,如果条件为真,则在这些段中执行操作。默认条件为“true”,默认操作为“print$0”,因此所有5个表达式都是等价的:'1==1{print$0}'、'{print$0}'、'1==1'、'{print}'、'1',每个表达式都只打印当前记录。我知道表达式的结尾是/mean{print$0},并且~必须等于==对吗?但是为什么你要把你的模式[x]用“/”来包装呢?你误解了“/”和“~”的意思是常量正则表达式的分隔符。“~”是正则表达式运算符,可应用于常量REs,或包含REs或RE字符串的变量。所有这些都是条件,因此与作为动作的{print$0}完全无关。我建议你买一本书“有效的Awk编程,Arnold Robbins的第三版”(),因为它解释了所有这些。与此同时,当你等待它到来的时候,它的文本在网上。这就解释了为什么当同一个陈述包含多个真理时它不起作用。我的背景是生物学而不是计算机科学,所以我边学边学。我想在生物学中,有时不可能的事情是可能发生的只有在1美元之前没有空格的情况下,这才有效。另外,您不需要{print$0},因为这是默认操作。实际上,这里的
/^[^CD]/
转换为:
/…/
它是一个模式,
/^…/
模式位于行的开头,
/^[^CD]/
找到的第一个字母不应该是C或D。因此,正如您所说,如果任何字符放在C或D之前,这将不起作用,而且这也会过滤掉以C或D作为第一个字母的单词开头的任何行。我知道有很多awk书籍和其他文档都是关于“模式”的(有些是由发明该工具的人写的!)但是他们错了——awk主体由{}段组成,而不是{}段,否则如何解释“x>2{print}”?“x>2”显然是一种条件,而不是一种“模式”。无论如何,/…/是一个RE,不是一个模式,在这个上下文中它是$0~/…/的缩写,这也是一个条件,也不是模式。你是对的。我可能不恰当地使用了“模式”一词。根据awk手册,“模式”是您在评论中所称的
。我会根据你的评论来编辑我的答案。是的,awk手册和我所知道的所有awk书籍在使用术语“模式”而不是“条件”时都是错误的。我认为awk最初的目的是在一些文本中寻找一种模式,因此原始文档使用了这个术语,并从那时起传播到了其他文档中,但awk在这种背景下已经有20年没有真正的“模式”,即使是在那时。即使是旧的、破损的awk也不局限于在该上下文中有一个“模式”。