Linux Bash-根据条件筛选行

Linux Bash-根据条件筛选行,linux,bash,awk,wc,Linux,Bash,Awk,Wc,我有一个包含以下行的文件: @SRR4293695.199563512 199563512 CAAAANCATTCGTAGACGACCTGCTCTGTNGNTACCNTCAANAGATCNGAAGAGCACACGTCTGAACTCCAGTCAC +SRR4293695.199563512 199563512 A.AA<#FF)FFFFFFF<<<<FF7FFFFFF#.#<FF<#FFFF#FF<A<#FFFFFFFAFFFFFFAAAF

我有一个包含以下行的文件:

@SRR4293695.199563512 199563512 
CAAAANCATTCGTAGACGACCTGCTCTGTNGNTACCNTCAANAGATCNGAAGAGCACACGTCTGAACTCCAGTCAC
+SRR4293695.199563512 199563512 
A.AA<#FF)FFFFFFF<<<<FF7FFFFFF#.#<FF<#FFFF#FF<A<#FFFFFFFAFFFFFFAAAFFFFF<FFFF.
@SRR4293695.199563513 199563513 
CTAAANCATTCGTAGACGACCTGCTT
+SRR4293695.199563513 199563513 
<AAAA#FFFFFF<FFFFFFFFFFFFF
@SRR4293695.199563514 199563514 
CCAACNTCATAGAGGGACAAGTGGCGATCNGNC
+SRR4293695.199563514 199563514 
AAAAA#<F.F<<FA.F7AA.)<FAFA..7#.#A
@SRR4293695.199563515 199563515 
TCGCGNCCTCAGATCAGACGTGGCGA
+SRR4293695.199563515 199563515 
AAAAA#FFFFFF<FFFFFFFFFFFFF
@SRR4293695.199563516 199563516 
TGACCNGGGTCCGGTGCGGAGAGCCCTTC
+SRR4293695.199563516 199563516 
AAAAA#FAFFFF<F.FFAA.F)FFFFFAF
@SRR4293695.199563517 199563517 
AAATGNTCATCGACACTTCGAACGCACT
+SRR4293695.199563517 199563517 
AA)AA#F<FFFFFFAFFFFF<)FFFAFF
@SRR4293695.199563518 199563518 
TCGTANCCAATGAGGTCTATCCGAGGCGCN
+SRR4293695.199563518 199563518 
AAAAA#<FAAFFFF.FFFFFFFA.FFFFF#
@SRR4293695.199563519 199563519 
AAAACNATTCGTAGACGNCCTGCTTNTGTNGNCACCNTNANNANNTCNGNAGAGCNCACNTCTGAACTCNAGTCAC
+SRR4293695.199563519 199563519 
AAAAA#FFFFFFFFFFF#FFFFFFF#FF<#F#F.FF#7#F##F##A)#A#FF<F)#AAF#<FFFFAFF<#<FFFFF
@SRR4293695.199563520 199563520 
GAAGCNGCACAGCTGGCNTTGGAGCNGANNCNGTAGNCNCNNTNNATNGNTCGGNNGAGNACACGTCTGNACTCCA
+SRR4293695.199563520 199563520 
AAAAA#FFFFFFFFFFF#FFFFFFF#FF##A#FFFF#F#F##<##FF#F#FFFF##FFF#FFFFFFFFF#FFFFFF
@SRR4293695.199563521 199563521 
TGGTCNGTGGGGAGTCGNCGCCTGCNTANNANTGTANGNANNANNAANANATCGNNAGANCACACGTCTNAACTCC
+SRR4293695.199563521 199563521 
AAAAA#FFFFFFFFFFF#FFFFFFF#FF##F#FFFF#F#F##A##FF#A#FFFF##<FF#FFFFFFFFF#F<FFFF
@SRR4293695.199563522 199563522 
TCGTANCCAATGAGGTCTATCCGAGGCGCN
+SRR4293695.199563522 199563522
AAAAA#<FAAFFFF.FFFFFFFA.FFFFF#
@SRR4293695.199563512 199563512
CAAAANCATTCGTAGACCTGCTCTGTNGTACCNTCAANAGATCNGAAGAGCACGTCGACTGACTCCAGTCAC
+SRR4293695.199563512 199563512

A.AA
sed
方法:

sed -n 'h;n;/.\{34,\}/!{x;G;p}' inputfile > outputfile
  • h;n
    奇数行进入
    h
    旧缓冲区,然后获取
    n
    ext行
  • 将检查生成的偶数行的长度。如果它们不超过34个字符,则保持缓冲区是e
    x
    ,随模式空间变化,然后附加到它上(
    x;G;
    ),这样两行都在模式空间中,并且
    p
    打印

  • sed
    方法:

    sed -n 'h;n;/.\{34,\}/!{x;G;p}' inputfile > outputfile
    
  • h;n
    奇数行进入
    h
    旧缓冲区,然后获取
    n
    ext行
  • 将检查生成的偶数行的长度。如果它们不超过34个字符,则保持缓冲区是e
    x
    ,随模式空间变化,然后附加到它上(
    x;G;
    ),这样两行都在模式空间中,并且
    p
    打印

  • 以下是一个awk解决方案:

    awk '!last { last = $0; next } length($0)<=34 { print last; print } { last = "" }' YOURFILE
    

    awk'!last{last=$0;next}length($0)这里有一个awk解决方案:

    awk '!last { last = $0; next } length($0)<=34 { print last; print } { last = "" }' YOURFILE
    

    awk'!last{last=$0;next}length($0)您的代码在哪里?
    …somecommand…>>$outputFile
    一次又一次地重复是非常低效的——当您将其分别放在每一行上时,您的脚本每次要追加一行时都会重新打开该文件。相反,您应该只打开一次输出文件(例如,脚本顶部的“
    exec>”$outputFile“
    将截断该文件,并使脚本中所有未来的stdout重定向到该文件)。也就是说,如果您真的想要吞吐量,最好编写awk脚本而不是bash(或者,如果您真正关心性能,请使用Go或Julia等语言,并将其牢记在心)。谢谢你指出@CharlesDuffy。是的,我想写一个awk脚本。问题是我还不是专家。你的代码在哪里?
    …somecommand…>>$outputFile
    一次又一次的效率很低——当你把它分别放在每一行上时,你的脚本每次想附加一个单独的代码时都会重新打开文件相反,您应该只打开一次输出文件(例如,脚本顶部的“
    exec>”$outputFile“
    将截断该文件,并使脚本中所有未来的stdout重定向到该文件)。也就是说,如果您真的想要吞吐量,最好编写一个awk脚本而不是bash(或者,如果您真正关心性能,请使用Go或Julia等语言,并将其牢记在心)。谢谢你指出@CharlesDuffy。是的,我想写一个awk脚本。问题是我还不是专家。非常感谢!这正是我要找的!非常感谢!这正是我要找的!