Sie müssen das vierte Wort einer Zeile nehmen und an den Anfang der Zeile kopieren (sed awk).

Sie müssen das vierte Wort einer Zeile nehmen und an den Anfang der Zeile kopieren (sed awk).

Ich habe eine Datei mit 5 Millionen Zeilen:

xx ss ss "abcde"

Ich muss "abcde"es nehmen und an den Anfang jeder Zeile kopieren:

"abcde" xx ss ss "abcde"

Die Zeichenfolge "abcde"ändert sich in jeder Zeile, es handelt sich also nicht um ein bestimmtes Wort, sondern immer um das vierte Wort in jeder Zeile.

Antwort1

Ein alternatives awk:

awk '{print $4,$0}' file

Testen:

$ cat file7
abc def ghi nop
klm one two three
four five six nine

$ awk '{print $4,$0}' file7
nop abc def ghi nop
three klm one two three
nine four five six nine

Antwort2

Mit sed, vorausgesetzt, die Spalten sind durch mehrere Leerzeichen getrennt und es könnten zusätzliche Spalten vorhanden sein:

sed 's/\([^ ]* *\)\{3\}\([^ ]*\)/\2 &/'

Das Muster entspricht drei wiederholten Spalten, die als Nicht-Leerzeichen, gefolgt von Leerzeichen, identifiziert sind, gefolgt von einer weiteren Spalte, die wie \2in der Ersetzungszeichenfolge referenziert wird. Dadurch &wird die gesamte Übereinstimmung in die Ersetzung eingefügt, sodass die vierte Spalte vor dem gesamten Rest der Zeile eingefügt wird.

Beachten Sie, dass dies mit mehr als vier Spalten funktioniert, jedoch fehlschlägt, wenn keine vierte Spalte vorhanden ist.

Dasselbe gilt, wenn erweiterte reguläre Ausdrücke verfügbar sind (FreeBSD oder GNU sed):

sed -E 's/([^ ]* *){3}([^ ]*)/\2 &/'

Antwort3

Hier gibt es bessere Antworten, aber hier ist eine For-In-Schleife, die auch funktioniert:

IFS=$'\n'; for i in $(cat file); do var=$(echo $i | awk '{print $4}')  ; sed -i "s/.*$var/$var &/g" file ;done

Antwort4

Wir platzieren das 4. Feld $F[3]zusammen mit dem Listentrennzeichen $"(standardmäßig space) am Anfang des Datensatzes/der Zeile. Die -pOption wird autoprintden Datensatz.

perl -pale 's/^/$F[3]$"/' yourfile

Mit dem sed-Befehl speichern wir eine Kopie des Originals und zäunen das 4. Feld ein. Dann entfernen wir den führenden Teil. Und stellen das Original wieder her, indem wir es an den Musterraum anhängen, der jetzt das 4. Feld enthält.

sed -e '
   /\n/!h
   //!s/\S\+/\n&\n/4
   /\n.*\n/D
   s/\n.*//;G;s/\n/ /
' yourfile

verwandte Informationen