Você pode fazer isso com uma única invocação sed
, não é necessário ler o arquivo duas vezes:
sed '$!n
w even
d' infile > odd
ou, se você preferir em uma linha:
sed -e '$!n' -e 'w even' -e d infile > odd
Observe que isso não dará o resultado esperado se um arquivo contiver apenas uma linha (a linha será w
ritten para even
em vez de odd
, pois o primeiro n
não será executado). Para evitar isso, adicione uma condição:
sed -e '$!n' -e '1!{w even' -e 'd}' infile > odd
Como funciona? Bem, ele usa três sed
comandos:
n
- se não na última linha imprime o espaço padrão para stdout
(que é redirecionado para o arquivo odd
), substitua com a próxima linha (então agora está processando uma linha par) e continue executando os comandos restantes em w
- acrescente o espaço padrão para o arquivo even
e d
- apague o espaço padrão atual e reinicie o ciclo - o efeito colateral disso é que sed
nunca irá imprimir automaticamente o espaço de padrão, uma vez que nunca chega ao final do script
Em outras palavras, n
é executado apenas em linhas ímpares e w
e d
são executados apenas em linhas pares. sed
nunca consegue imprimir automaticamente, a menos que, como eu disse, a entrada consiste em uma única linha.