繁体   English   中英

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 ($1 !~ />.*/ && x == 0)
    { print "Not a FASTA file"; exit; }
  else { x = 1; next; }
  print $0 }
END { print " - DONE - "; }'

基本上你可以使用以下awk命令:

awk 'NR==1 && /^>./ {p=1} p' file

在第一行NR==1它检查行是否以>后跟“something”( /^>.//^>./ 如果该条件为真,则变量p将设置为1。 最后的p检查p是否计算为true并在这种情况下打印行。

如果要打印错误消息,则需要稍微恢复逻辑:

awk 'NR==1 && !/^>./ {print "Not a FASTA file"; exit 1} 1' file

在这种情况下,如果第一行没有以>开头,程序将打印错误消息并退出程序。 否则所有行都会被打印,因为1总是计算为true。

从字面上看这个OP

awk 'NR==1{p=$0~/^>/}p' YourFile
# shorter version with info of @EdMorton
awk 'NR==1{p=/^>/}p' YourFile

for line>>(包括)

awk '!p{p=$0~/^>/}p' YourFile
# shorter version with info of @EdMorton
awk '!p{p=/^>/}p' YourFile

因为你关心的只是第一行,你可以检查一下,然后退出。

awk 'NR > 1 { exit (0) }
    ! /^>/ { print "Not a FASTA file" >"/dev/stderr"; exit (1) }' file

正如评论中所述, >"/dev/stderr"是一个不可移植的hack,可能对你不起作用。 如果你想要一个符合标准Unix工具所期望的工具(如果没有问题则默默运行;报告标准错误的问题),将它视为稍微复杂的占位符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM