loop sed para excluir a linha com strings fornecidas em uma lista de strings de um arquivo de texto

0

Eu tenho este script sed no qual estou trabalhando para excluir toda a linha da minha tabela do OTU quando as espécies listadas em um arquivo de texto são encontradas em minha tabela do OTU.

O script que tenho agora e que não funciona está abaixo, mas não consigo fazer funcionar. De qualquer forma, se você pudesse por favor me ajudar o mais rápido possível, seria muito apreciado.

(leia cada linha, procure por ela na minha tabela e exclua linha, infile)

for i in $(cat /my/path/species.txt); do 
    sed -i '/"$i"/d' /my/path/ITS.OTU.table.tsv
done

muito obrigado

    
por Émilie Tremblay 27.10.2017 / 16:09

3 respostas

0

Este é o seu script:

while read -r line 
do
    echo $line
    sed -i "/$line/d" /my/path/ITS.OTU.table.tsv
done < /my/path/species.txt

A linha echo $ é mais para fins de depuração, portanto, remova-a eventualmente.

    
por 27.10.2017 / 16:29
3
grep -v -xF -f /my/path/species.txt /my/path/ITS.OTU.table.tsv >/my/path/ITS.OTU.table.tsv.new

Isso gravaria /my/path/ITS.OTU.table.tsv.new . Seu conteúdo seria todas as linhas do arquivo original que não correspondem exatamente a uma linha em /my/path/species.txt .

As opções -xF forçam uma correspondência de linha completa idêntica à string e -f filename lê as linhas para correspondência com o arquivo fornecido. O -v inverte o sentido da correspondência para que apenas as linhas não correspondam sejam retornadas.

Se você precisar relaxar a correspondência para que uma sequência de caracteres lida de /my/path/species.txt possa corresponder a em qualquer lugar em cada linha de /my/path/ITS.OTU.table.tsv , remova a opção -x .

Se você sabe onde em cada linha uma partida deve ser testada, pode-se usar awk para comparar apenas esses dados, mas atualmente não sabemos como são seus dados.

    
por 03.12.2018 / 17:05
0

Para o unix, como MacOS / BSD / Solaris, você precisa passar uma string vazia para sed para evitar o problema que Emilie encontrou, então a resposta seria:

while read -r line 
do
    echo $line
    sed -i "" "/$line/d" /my/path/ITS.OTU.table.tsv
done < /my/path/species.txt
    
por 03.12.2018 / 14:26