awk
Approche alternative :
$ 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
La façon dont cela fonctionne est simple: la première ligne est un cas spécial - nous l'imprimons sans nouvelle ligne, et demandons à awk d'aller à la ligne suivante sans exécuter d'autres blocs de code. Après cela, NR == 1{printf "%s", $0;next}
est ignoré, mais d'autres parties font le travail.
N'oubliez pas que jusqu'à présent, nous avons imprimé une chaîne formatée sans nouveau caractère de ligne. Ainsi, ce qui se fait printf " %s\n%s",$1,$0
maintenant, c'est que le premier mot est imprimé (et parce qu'il n'y avait pas de nouvelle ligne, il reste sur la même ligne de sortie), la nouvelle ligne insérée, puis la ligne entière elle-même (mais ne se termine pas par le caractère de nouvelle ligne) . Ainsi, le premier premier mot inséré restera sur la même ligne. Le processus se poursuit indéfiniment jusqu'à la fin du fichier.
L'amélioration possible consiste à inclure un END{print ""}
bloc pour insérer la nouvelle ligne finale. Dans certains cas, lorsque le fichier résultant doit être traité par d'autres scripts, il peut être souhaitable.
Bien que l'utilisateur ait spécifiquement demandé AWK, la même approche avec l'impression de chaînes formatées peut être adoptée avec d'autres langues, par exemple Python. Alternative Python fournie pour ceux curieux de savoir comment cela peut être implémenté dans d'autres langues:
#!/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=" ")
Et une utilisation comme ça:
$ ./append_first.py < input.txt
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
La même idée sur la nouvelle ligne finale s'applique ici.
sed
seul sanspaste
:sed -r 'N;s/\n(\w+)/\1&/;P;D' somefile.txt