2016-07-07 6 views
1

Ich habe eine Textdatei, die wie folgt aussieht:Awk: Zählen alle Raum bis zur zweiten Spalte als eine einzelne Variable?

This is the first line 80 55 75% 
Second line    25 95 74% 
The next line    50 50 50% 

Wie Sie auf der linken Seite die Anzahl der Wörter variieren sehen können. wenn ich einen Befehl wie diese Derzeit verwenden:

awk 'NR == 1 {print $1,$2,$3,$4}' file 

Dies funktioniert sehr gut funktioniert für die erste Zeile und kehrt:

This is the first line 

Aber wenn ich dies tun, in der zweiten Zeile:

awk 'NR == 2 {print $1,$2,$3,$4}' file 

ich dieses, wie erwartet:

Second line 25 95 

Aber das ist nicht was ich brauche. Für Scripting-Zwecke brauche ich awk oder vielleicht ein anderes Werkzeug, um etwas bis zur zweiten Zahlenspalte als eine einzige Variable zu "sehen". Unabhängig von der Anzahl der Wörter auf der linken Seite werden sie immer als eine einzige Variable angesehen. Wie kann ich das erreichen?

HINWEIS: Ich kann Zeilen wie diese:

This is a testmarket001 65 45 25% 

Ich denke also nicht einfach awk sagen können alle Wörter bis zur ersten Nummer zu drucken, wie es ein Teil der Linie abgeschnitten würde .

+0

Haben Sie Registerkarten zwischen Spalten? Dies würde das Leben viel einfacher machen. – fedorqui

+0

Haben Sie am Ende nur 3 Nummern? Eine andere Möglichkeit, das Leben einfacher zu machen :) – Fazlin

+0

warum nicht nur [a-z] [A-Z] nur aus der ganzen Zeile auswählen? – SMA

Antwort

1

Wenn es immer 3 Leerzeichen sind trennt Wörter am Ende jeder Zeile können Sie diese awk benutzen, um Ihre Ausgabe zu erhalten:

awk '{gsub(/(\s+\S+){3}\s*$/, "")} 1' file 

This is the first line 
Second line 
The next line 

Sie auch sed verwenden:

sed -E 's/(\s+\S+){3}\s*$//' file 
1

Wenn Ihr Felder sind tabulatorgetrennt, setzen Sie einfach das Trennzeichen für awk

$ paste file1 file2 file3 | awk -F'\t' '{print $1}' 

sollte funktionieren.

Beachten Sie, dass der Befehl column die Registerkarten ändert. Wenn Ihre Datei nach column Formatierung gespeichert wird, können Sie dies versuchen

$ awk '{for(i=1;i<NF-2;i++) printf "%s ",$i; print ""}' file 

This is the first line 
Second line 
The next line 
Verwandte Themen