Excluindo linhas de um arquivo por meio de stdin piping no bash

0

Usando este script:

awk '{print $0"\t"NR}' test | grep NA | awk '{print $21}'

Eu obtenho os números de linha no meu arquivo, tendo "NA" neles

326
399
672
1512
1734
1737
2212

Usando o sed , posso excluir essas linhas do meu arquivo no mesmo comando através da entrada padrão, canalizando após o último comando awk? Se não, existe alguma maneira de fazer isso de uma maneira simples?

    
por rishi 26.02.2018 / 11:21

2 respostas

2

Seria muito chato apenas escrever isso como um comando awk ?

awk '!/NA/' test 

A ação padrão é print da linha inteira, portanto, é o mesmo que !/NA/ { print $0 } e seria impressa qualquer linha que não contenha NA .

    
por 26.02.2018 / 11:23
3

A maneira mais simples é usar apenas sed :

sed '/NA/d' test >test.new

Se você quiser fazer uma edição no local com o GNU sed (isso modificará o arquivo test ):

sed -i '/NA/d' test

A expressão sed /NA/d aplicará o comando d em todas as linhas da entrada que corresponder à expressão regular NA . O comando d exclui linhas.

Se os números de linha fossem todos , então os seguintes teriam funcionado também:

some_command | sed 's/$/d/' | sed -f /dev/stdin test >output

em que some_command gera os números de linha que você deseja excluir do arquivo test .

O primeiro sed transforma o fluxo de números em um script sed , adicionando d a cada linha. Uma linha contendo 100d seria interpretada como "excluir linha 100". Isso é então alimentado para o segundo sed como o script real (ele está lendo o script via /dev/stdin ) e é aplicado ao arquivo test .

O equivalente em um shell que sabe sobre substituições de processos:

sed -f <( some_command | sed 's/$/d/' ) test >output

Mas isso é bobagem se você quiser apenas excluir linhas que contenham a string NA .

    
por 26.02.2018 / 11:23

Tags