Como otimizar este oneliner? (se a segunda coluna estiver vazia, coloque a linha em outro arquivo)

2

Eu tenho um pouco de "oneliner":

while read ONELINE; do
  if [[ -n "'echo $ONELINE | awk '{print $2}''" ]]; then
    echo "$ONELINE" >> LIST-ok.txt
  else
    echo "$ONELINE" >> LIST-notok.txt
  fi
done < ORIGINALLIST.txt

mas é extremamente lento. Como posso otimizá-lo para fazer a mesma coisa, mas muito mais rápido? Se a segunda coluna estiver vazia, coloque a linha dada em outro arquivo.

    
por gasko peter 23.02.2014 / 17:46

3 respostas

3

Você já marcou a pergunta , portanto, use isso:

awk '{if (NF>=2) {print > "LIST-ok.txt"} else {print > "LIST-notok.txt"}}' filename

Outra maneira de dizer o mesmo seria fazer uso do operador ternário:

awk '{f=NF>=2?"LIST-ok.txt":"LIST-notok.txt"; print > f}' filename
    
por 23.02.2014 / 17:54
2

A versão perl do onkiner awk do @ devnull:

perl -alne 'print { $#F ? stdout : stderr } $_' < original >list-ok 2>list-notok
    
por 24.02.2014 / 02:40
1

Que tal grep?

grep "[^ ][^ ]* [^ ]" <  ORIGINALLIST.txt > LIST-ok.txt
grep -v "[^ ][^ ]* [^ ]" <  ORIGINALLIST.txt > LIST-notok.txt
    
por 24.02.2014 / 00:54