我正在尝试编写一个AWK脚本来解析窗体
的文件> field1 - field2 field3 ...
lineoftext
anotherlineoftext
anotherlineoftext
我正在检查使用正则表达式,如果第一行是正确的(以>开头,然后有一些东西),然后打印所有其他行。这是我写的脚本,但它只验证文件的格式是否正确,然后不打印任何内容。
#!/bin/bash
# FASTA parser
awk ' BEGIN { x = 0; }
{ if ($1 !~ />.*/ && x == 0)
{ print "Not a FASTA file"; exit; }
else { x = 1; next; }
print $0 }
END { print " - DONE - "; }'
答案 0 :(得分:8)
基本上你可以使用以下awk命令:
awk 'NR==1 && /^>./ {p=1} p' file
在第一行NR==1
上,它检查该行是以>
后跟“某事”(/^>./
)开头的。如果该条件为真,则变量p
将设置为1。最后的p
检查p
是否为真,并在这种情况下打印该行。
如果要打印错误消息,需要稍微恢复逻辑:
awk 'NR==1 && !/^>./ {print "Not a FASTA file"; exit 1} 1' file
在这种情况下,如果第一行没有以>
开头,程序将打印错误消息并退出程序。否则,所有行都会被打印,因为1
总是计算为true。
答案 1 :(得分:1)
对于这个OP字面意思
awk 'NR==1{p=$0~/^>/}p' YourFile
# shorter version with info of @EdMorton
awk 'NR==1{p=/^>/}p' YourFile
for the line after> (包括)
awk '!p{p=$0~/^>/}p' YourFile
# shorter version with info of @EdMorton
awk '!p{p=/^>/}p' YourFile
答案 2 :(得分:0)
由于你所关心的只是第一行,你可以检查一下,然后退出。
awk 'NR > 1 { exit (0) }
! /^>/ { print "Not a FASTA file" >"/dev/stderr"; exit (1) }' file
正如评论中所述,>"/dev/stderr"
是不可移植的黑客,可能对您不起作用。如果你想要一个符合标准Unix工具所期望的工具(如果没有问题则静默运行;将问题报告给标准错误),将它视为稍微复杂的占位符。