Alternativa awk
abordagem:
$ awk 'NR == 1{printf "%s", $0;next}{printf " %s\n%s", $1,$0}' input.txt
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
A maneira como isso funciona é simples: a primeira linha é um caso especial - nós a imprimimos sem a nova linha e pedimos ao awk que vá para a próxima linha sem executar outros blocos de código. Depois disso, NR == 1{printf "%s", $0;next}
é ignorado, mas outras partes fazem o trabalho.
Lembre-se de que até agora imprimimos uma string formatada sem o novo caractere de linha. Assim, o que está sendo feito por printf " %s\n%s",$1,$0
agora é a primeira palavra impressa (e porque não havia nova linha, permanece na mesma linha de saída), nova linha inserida e, em seguida, toda a própria linha (mas não termina com caractere de nova linha). Assim, a próxima primeira palavra inserida permanecerá na mesma linha. O processo continua e continua até chegarmos ao final do arquivo.
A possível melhoria é incluir o bloco END{print ""}
para inserir a nova linha final. Em certos casos em que o arquivo resultante deve ser processado por outros scripts, pode ser desejável.
Embora o usuário tenha solicitado especificamente o AWK, a mesma abordagem com a impressão de strings formatadas pode ser obtida com outros idiomas, por exemplo, o Python. Alternativa em Python fornecida para aqueles curiosos sobre como isso pode ser implementado em outras linguagens:
#!/usr/bin/env python
from __future__ import print_function
import sys
old = None
for index,line in enumerate(sys.stdin):
if index == 0:
print(line.strip(),end=" ")
continue
words = line.strip().split()
print(words[0] + "\n" + line.strip(),end=" ")
E uso assim:
$ ./append_first.py < input.txt
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
A mesma ideia sobre a nova linha final se aplica aqui.