用于检查文件的第一行然后打印其余部分的 AWK 脚本
AWK script to check first line of a file and then print the rest
我正在尝试编写 AWK 脚本来解析格式为
的文件
> field1 - field2 field3 ...
lineoftext
anotherlineoftext
anotherlineoftext
我正在使用正则表达式检查第一行是否正确(以 > 开头,然后是后面的内容),然后打印所有其他行。这是我写的脚本,但它只验证文件格式是否正确,然后不打印任何内容。
#!/bin/bash
# FASTA parser
awk ' BEGIN { x = 0; }
{ if ( !~ />.*/ && x == 0)
{ print "Not a FASTA file"; exit; }
else { x = 1; next; }
print [=11=] }
END { print " - DONE - "; }'
基本上你可以使用下面的awk命令:
awk 'NR==1 && /^>./ {p=1} p' file
在第一行 NR==1
上,它检查该行是否以 >
开头,后跟 "something" (/^>./
)。如果该条件为真,变量 p
将被设置为 1。最后的 p
检查 p
是否为真并在这种情况下打印该行。
如果你想打印错误信息,你需要稍微反转一下逻辑:
awk 'NR==1 && !/^>./ {print "Not a FASTA file"; exit 1} 1' file
在这种情况下,如果第一行不是以 >
开头,程序将打印错误消息并退出程序。否则所有行都会打印出来,因为 1
总是求值为真。
因为你只关心第一行,所以你可以检查一下,然后退出。
awk 'NR > 1 { exit (0) }
! /^>/ { print "Not a FASTA file" >"/dev/stderr"; exit (1) }' file
如评论中所述,>"/dev/stderr"
是一种不可移植的 hack,可能不适合您。如果您想要一个行为与标准 Unix 工具相同的工具,请将其视为稍微复杂一些的占位符(运行 如果没有问题则静默;将问题报告给标准错误)。
对于这个 OP 字面意思
awk 'NR==1{p=[=10=]~/^>/}p' YourFile
# shorter version with info of @EdMorton
awk 'NR==1{p=/^>/}p' YourFile
>(包括)
之后的行
awk '!p{p=[=11=]~/^>/}p' YourFile
# shorter version with info of @EdMorton
awk '!p{p=/^>/}p' YourFile
我正在尝试编写 AWK 脚本来解析格式为
的文件> field1 - field2 field3 ...
lineoftext
anotherlineoftext
anotherlineoftext
我正在使用正则表达式检查第一行是否正确(以 > 开头,然后是后面的内容),然后打印所有其他行。这是我写的脚本,但它只验证文件格式是否正确,然后不打印任何内容。
#!/bin/bash
# FASTA parser
awk ' BEGIN { x = 0; }
{ if ( !~ />.*/ && x == 0)
{ print "Not a FASTA file"; exit; }
else { x = 1; next; }
print [=11=] }
END { print " - DONE - "; }'
基本上你可以使用下面的awk命令:
awk 'NR==1 && /^>./ {p=1} p' file
在第一行 NR==1
上,它检查该行是否以 >
开头,后跟 "something" (/^>./
)。如果该条件为真,变量 p
将被设置为 1。最后的 p
检查 p
是否为真并在这种情况下打印该行。
如果你想打印错误信息,你需要稍微反转一下逻辑:
awk 'NR==1 && !/^>./ {print "Not a FASTA file"; exit 1} 1' file
在这种情况下,如果第一行不是以 >
开头,程序将打印错误消息并退出程序。否则所有行都会打印出来,因为 1
总是求值为真。
因为你只关心第一行,所以你可以检查一下,然后退出。
awk 'NR > 1 { exit (0) }
! /^>/ { print "Not a FASTA file" >"/dev/stderr"; exit (1) }' file
如评论中所述,>"/dev/stderr"
是一种不可移植的 hack,可能不适合您。如果您想要一个行为与标准 Unix 工具相同的工具,请将其视为稍微复杂一些的占位符(运行 如果没有问题则静默;将问题报告给标准错误)。
对于这个 OP 字面意思
awk 'NR==1{p=[=10=]~/^>/}p' YourFile
# shorter version with info of @EdMorton
awk 'NR==1{p=/^>/}p' YourFile
>(包括)
之后的行awk '!p{p=[=11=]~/^>/}p' YourFile
# shorter version with info of @EdMorton
awk '!p{p=/^>/}p' YourFile