2012-12-24 1 views
5

Ich habe eine Textdatei wie folgt aus:Wie kann ich ein bestimmtes Feld einer Datei mit awk in Großbuchstaben ändern?

1 http http 3 4 5 
2 dns dns 4 
3 ftp ftp 4 5 6 8 

Ich möchte die Ausgabe wie folgt sein:

1 HTTP http 3 4 5 
2 DNS dns 4 
3 FTP ftp 4 5 6 8 

Ich möchte aus Kleinbuchstaben in Großbuchstaben das zweite Feld ändern und nur das zweite Feld.

Beachten Sie, dass die Anzahl der Felder in einer bestimmten Zeile nicht festgelegt ist.

Kann ich dieses Ziel mit awk erreichen?

Antwort

8

Sie können sicher. Hier ist, wie:

awk '$2 = toupper($2)' file 

Ergebnisse:

1 HTTP http 3 4 5 
2 DNS dns 4 
3 FTP ftp 4 5 6 8 

Aus dem Handbuch:

tolower (str)

Gibt eine Kopie des Strings str, mit allen Großbuchstaben Zeichen in Str übersetzt zu ihren entsprechenden Kleinbuchstaben Gegenstücke. Nicht alphabetische Zeichen bleiben unverändert.

toupper (str)

Gibt eine Kopie des Strings str, mit allen Klein Zeichen in str übersetzt ihre Groß- Pendants entsprechen. Nicht alphabetische Zeichen bleiben unverändert.


machte ich die Annahme, dass Ihre Beispieldaten gegeben, würde es mindestens drei Spalten hat und dass die variable Komponente, die Sie gilt nach dieser den Worten enthalten, die Spalten zu diskutieren. Wenn ich falsch war, kann man einfach die bedingte hinzu:

awk 'NF>1 { $2 = toupper($2) }1' file 
+0

Vorsicht: Dies wird Zeilen löschen mit nur einem Feld. Vielleicht 'awk' ($ 2 = toupper ($ 2)) || 1 'file' –

+0

Dies bricht auf einer Zeile, die weniger als 2 Felder hat. In diesem Fall wird die Zeile nicht gedruckt, da '$ 2' für die leere Zeichenfolge ausgewertet wird. Ich würde vorsichtig sein mit einer Zuweisung, wo awk einen Test erwartet. Es bricht auch, wenn Sie "awk -F" [] "$ 2 = toupper ($ 2)" <<< "a b c" tun, wobei das 2. Feld der leere Stich ist. Es kann leicht mit 'awk' korrigiert werden NF> 1 {$ 2 = toupper ($ 2)} 1 'Datei'. – jfg956

+0

@WilliamPursell: Ihre Lösung fügt einen Endplatz in Zeilen mit einem einzelnen Feld hinzu. – jfg956

0
perl -F -ane '$F[1] = lc($F[1]);print "@F"' your_file