Bash - 根据条件过滤行

Bash - Filtering lines according to a condition

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

@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#

然后,我想根据条件过滤这些行: 考虑到偶数行的长度:如果该长度 > 34,则必须删除该行和前面的行。

我已经做了一个算法:用一段时间读取文件中的所有行,检查条件并只保留长度 < 34 的行。问题是它需要一些时间。

inputFile= 
outputFile=

while read first_line; read second_line
  do
    lread=${#second_line}
    if [[ "$lread" -le 34 ]] ; then
        echo $first_line >> $outputFile
        echo $second_line >> $outputFile
    fi
done < $inputFile 

# This is for the last two lines
lread=${#second_line}
if [[ "$lread" -le 34 ]] ; then
  echo $first_line >> $outputFile
  echo $second_line >> $outputFile
fi

我在想有没有别的办法,更快。

预期输出:

@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.199563522 199563522 
TCGTANCCAATGAGGTCTATCCGAGGCGCN
+SRR4293695.199563522 199563522
AAAAA#<FAAFFFF.FFFFFFFA.FFFFF#

提前致谢!

sed方法:

sed -n 'h;n;/.\{34,\}/!{x;G;p}' inputfile > outputfile
  1. h;n 奇数行进入 hold 缓冲区,然后得到 next行。
  2. 检查生成的偶数行的长度。如果它们 not 超过 34 个字符,则保留缓冲区为 exchange d 使用模式 space,然后附加到它,(x;G;),这样两行都在模式 space 中,并且 printed.

这是一个 awk 解决方案:

awk '!last { last = [=10=]; next } length([=10=])<=34 { print last; print } { last = "" }' YOURFILE

输出是您的预期输出。