Bash - 根据条件过滤行

时间:2018-04-05 02:53:01

标签: linux bash awk wc

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

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

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

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

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

我想知道是否没有其他办法,更快。

预期产出:

import os
temp = os.system('ls -l /home/demo/ | wc -l')

no_of_files = temp - 1

command = "ls -l /home/demo/ | awk 'NR>1 {print $9}'"

file_list=[os.system(command)]

for i in range(len(file_list))
    os.system('tail -1 file_list[i]')

提前致谢!

2 个答案:

答案 0 :(得分:2)

这是一个awk解决方案:

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

输出是您的预期输出。

答案 1 :(得分:0)

sed方法:

sed -n 'h;n;/.\{34,\}/!{x;G;p}' inputfile > outputfile
  1. h;n奇数行进入h 缓冲区,然后获取n 分机行。
  2. 检查得到的偶数行的长度。如果他们超过34个字符,则保留缓冲区 e x 更改 d与模式空间,然后附加到它(x;G;),以便两行都在模式空间中,p rint ed。