2017-02-13 1 views
0

ich ein paar Zeilen, die wie folgt aussehen:ein Wort in mehreren Zeilen in eine andere Spalte verschieben

some_command -arg1 -arg2 ITEM -arg3 

Ich brauche ITEM direkt nach some_command

Die Datei Kommentare usw. nicht zu bewegen, so Ich muss die obige Operation nur auf Zeilen ausführen, die mit some_command beginnen.

Es gibt fast 1000 solcher Zeilen und ich kann es nicht manuell tun. Selbst die Verwendung des visuellen Block-Modus wird schwierig sein, da es keine Ausrichtung gibt.

Ich denke awk wird mein Freund hier sein. Die Position von ITEM ist fest, so kenne ich die Spalte Nummer. Aber wie kann ich awk zum Drucken $1 dann $6 und dann alle anderen Spalten von $2 bis $NF außer $6? Und tun Sie das auch nur auf Linien beginnend mit some_command?

+1

'awk‚/^some_command/{$ 1 = $ 1 "" $ 4; $ 4 = ""; } 1'' –

+0

@WilliamPurselell: Vielen Dank für netten Code, IMHO machen $ 4, da NULL Platzprobleme verursachen könnte, obwohl es überhaupt nicht getestet wurde. – RavinderSingh13

+0

@WilliamPurell ich sehe, was du da gemacht hast! Kluger Kerl bist du! funktioniert perfekt .. RavinderSingh13 du hast Recht, es fügt einen zusätzlichen Platz hinzu; aber das ist kein Problem für mich .. – shikhanshu

Antwort

1

@shikhanshu: Versuchen:

awk '/some_command/{$2="ITEM" FS $2;sub(/.*/,"",$(NF-1))} 1' Input_file 

ODER

awk '/some_command/{$2=$(NF-1) FS $2;sub(/.*/,"",$(NF-1))} 1' Input_file 
+0

Vielen Dank! Das funktioniert auch. Haben Sie den Vorteil, '/.*/' durch '' '' zu ersetzen, statt nur '$ (NF-1)' auf '" "' zu setzen? – shikhanshu

+1

@shikhanshu: Sie haben Recht, wie ich bereits erwähnt habe, es ist, den Raum gleich zu halten und nicht mit ihnen zu vermasseln. Außerdem $ (NF-1) speichern Sie uns, um den Wert jedes Feldes fest zu kodieren, so dass jedes Mal, wenn die Anzahl der Felder nichts ist, wenn Sie immer vorletztes Feld benötigen, es sollte dann fliegen. Ich hoffe das hilft dir. Lernen Sie weiter und fragen Sie weiter/teilen :) – RavinderSingh13

+0

Angenommen, es gibt keine kommentierten * some_command * Zeilen – NeronLeVelu

0

eine sed-Version

sed -e '/^[[:blank:]]*#/b' -e 's/\(some_command\)\(.*\)[[:blank:]]\([^-][^[:blank:]]\{1,\}\)/\1 \3\2/' YourFile 

Ihren Artikel Unter der Annahme, nicht mit einem - wie in yuour Probe starten (leichter), wenn nicht Leerzeichen ist der Separator und brauchen ein bisschen mehr Code

awk Version

awk '/^[[:blank:]]*some_command/ {t=$4; $4=$3; $3=$2; $2=t}7' YourFile 
Verwandte Themen