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.