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 .