Search code examples
linuxbashawkwc

Bash - Filtering lines according to a condition


I have a file that contains some lines as:

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

Then, I would like to filter these lines according to a condition : taking in consideration the length of even lines: if that length is > 34 then that line and the preceding line must be removed.

I already did an algorithm: using a while to read all lines in the file, checking the condition and retaining only lines with length < 34. The problem is that it is taking some time.

inputFile=$1 
outputFile=$2

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

I was wondering if there is not another way, quicker.

The expected output:

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

Thanks in advance!


Solution

  • Here's an awk solution:

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

    The output is your expected output.