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
.
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?
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
.