Alternativer awk
Ansatz:
$ 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
Die Funktionsweise ist einfach: Die erste Zeile ist ein Sonderfall - wir drucken sie ohne neue Zeile und weisen awk an, zur nächsten Zeile zu wechseln, ohne andere Codeblöcke auszuführen. Danach NR == 1{printf "%s", $0;next}
wird übersprungen, aber andere Teile erledigen den Job.
Denken Sie daran, dass wir bisher eine formatierte Zeichenfolge ohne neues Zeilenzeichen gedruckt haben. Was jetzt getan wird, printf " %s\n%s",$1,$0
ist, dass das erste Wort ausgedruckt wird (und da es keine neue Zeile gab, bleibt es in derselben Ausgabezeile), die neue Zeile eingefügt und dann die ganze Zeile selbst (aber nicht mit dem Zeilenumbruchzeichen endet). . Somit bleibt das nächste zuerst eingefügte Wort in derselben Zeile. Der Prozess geht weiter und weiter, bis wir das Ende der Datei erreichen.
Mögliche Verbesserung besteht darin, einen END{print ""}
Block einzuschließen, um die letzte neue Zeile einzufügen. In bestimmten Fällen, in denen die resultierende Datei von anderen Skripten verarbeitet werden soll, kann dies wünschenswert sein.
Während der Benutzer AWK speziell angefordert hat, kann der gleiche Ansatz beim Drucken formatierter Zeichenfolgen mit anderen Sprachen, beispielsweise Python, verfolgt werden. Python-Alternative für diejenigen, die neugierig sind, wie dies in anderen Sprachen implementiert werden kann:
#!/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=" ")
Und Verwendung wie folgt:
$ ./append_first.py < input.txt
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
Die gleiche Vorstellung von der endgültigen Newline gilt hier.
sed
ohnepaste
:sed -r 'N;s/\n(\w+)/\1&/;P;D' somefile.txt