use o comando sed com variável

1

Eu gostaria de deletar todas as linhas contendo uma certa string, assim como as próximas 3 linhas.

Eu posso usar o comando sed para fazer isso facilmente ao usar uma única string:

sed '/HISEQ:243:C9FH7ANXX:4:2202:4922:44902/,+3 d' ../input/infile.fq_1 > ../output/outfile.fq_1

A versão com aspas duplas também funciona:

sed "/HISEQ:243:C9FH7ANXX:4:2202:4922:44902/,+3 d" ../input/infile.fq_1 > ../output/outfile.fq_1

No entanto, gostaria de usar muitas strings. Cada string é uma linha em um arquivo de texto chamado strings.txt, e eu gostaria de combinar uma string de cada vez, removendo as linhas que combinam no infile, bem como as próximas 3 de cada vez, e escrevendo a saída para o outfile .

Então eu tentei:

cat strings.txt | while read LINE
do
sed '/$LINE/,+3 d' ../input/infile.fq_1 > ../output/outfile.fq_1
done

Mas a variável não é reconhecida com aspas simples. Se eu usar aspas duplas:

cat strings.txt | while read LINE
do
sed "/$LINE/,+3 d" ../input/infile.fq_1 > ../output/outfile.fq_1
done

Isso também não funciona.

Eu também tentei todos os tipos de variações, como usar chaves ou usar os dois tipos de citações:

cat strings.txt | while read LINE
do
sed '/'"$LINE"'/,+3 d' ../input/infile.fq_1 > ../output/outfile.fq_1
done

Mas nada parece funcionar. Ajuda seria muito apreciada!

    
por Mila 29.08.2016 / 19:14

1 resposta

0

O problema aqui é que você continua reescrevendo seu arquivo de saída a cada vez através do loop. Tente isto:

#!/bin/bash

cp ../input/infile.fg_1 temp

while read line; do
   sed -i "/$line/,+3 d" temp
done < strings.txt

mv temp ../output/outfile.fg_1

O -i no comando sed ADICIONA cada alteração ao arquivo temporário e, depois que todas as alterações tiverem sido feitas, nós o moveremos para o seu arquivo de saída. Se você quisesse trabalhar diretamente no arquivo de saída, faça o seguinte:

#!/bin/bash

cp ../input/infile.fg_1 ../output/outfile.fg_1

while read line; do
   sed -i "/$line/,+3 d" ../output/outfile.fg_1
done < strings.txt
    
por bashBedlam 30.08.2016 / 00:11