Spalte 2 aus der Textdatei ausschneiden

13

Meine Textdatei hat kein Trennzeichen, um nur Leerzeichen anzugeben. Wie schneide ich Spalte 2 aus, um die Datei auszugeben?

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

Also Ausgabe, die ich brauche, ist

207
412
432
Riley
quelle

Antworten:

12

Es ist am einfachsten awk, mehrere aufeinanderfolgende Leerzeichen als ein einziges zu behandeln

awk '{print $2}' file

druckt

207
412
431

Aber offensichtlich gibt es viele, viele andere Tools, die diese Aufgabe erfüllen, auch wenn sie nicht für folgende Aufgaben ausgelegt sind grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file
jimmij
quelle
4

Verwenden Sie Pipes, um Ihre Daten (z. B. cat columns.txt) in cut zu senden.

cat columns.txt | cut -d" " -f5

In den von Ihnen angegebenen Beispieldaten werden die gewünschten Daten durch ein einzelnes Leerzeichen in Feld 5 eingefügt. Um diese Ausgabe in eine andere Datei zu senden, verwenden Sie die Umleitung.

cat collumns.txt | cut -d" " -f5 > field2.txt

Mit dem Befehl awk können Sie Folgendes tun, um das Feld, nach dem Sie suchen, automatisch zu erkennen, da dort Daten vorhanden sind (?). Ich muss mehr über awk erfahren.

awk -F' ' '{print $2}' columns.txt
aeiounix
quelle
3
Die Inkaration cat ... |ist selten notwendig. Die meisten Unix-Befehle verwenden beispielsweise cuteine oder mehrere Eingabedateien als Argumente, z cut -d" " -f5 columns.txt.
Denis Howe
1

wie @jimmij sagte, awk '{print $2}' fileist die einfachste Antwort.

Wenn Sie aus irgendeinem Grund nicht verwenden möchten awkund darauf bestehen möchten cut, können Sie sedjede Instanz von zwei oder mehr Leerzeichen in eine einzelne Registerkarte ( cutdas Standardtrennzeichen) konvertieren, bevor Sie sie in cut umleiten:

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431
cas
quelle
0

Sie können weiterhin einzelne Leerzeichen als Trennzeichen verwenden. Sie haben nur mehr Spalten. cut -d' ' -fErhöhen Sie den Wert, den Sie geben, von 2 auf 5 oder vielleicht auf 6. Erhöhen Sie die Zahl, bis Sie die gewünschten Ergebnisse erhalten.

Ryder
quelle
0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

Oben ist sehr nützlich, wenn Linux-Dienstprogramme wie awk für die Datenextraktion nicht funktionieren, wenn Sie in einem Shell-Skript wie dem folgenden zu einem "Root" -Benutzer wechseln:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF
Alok Tiwari
quelle
1
Der einzige Grund, warum awkin Ihrem Beispiel " nicht funktioniert", ist, dass das Dokument hier nicht in Anführungszeichen gesetzt ist, was bedeutet, dass das Dokument $2von der Shell auf den zweiten Positionsparameter erweitert wird. Die Lösung besteht wahrscheinlich nicht darin, zu einem grepBefehl zu wechseln, sondern entweder dem $in $2as \$2zu entkommen oder einfach das gesamte Dokument mit <<'EOF'anstelle von zu zitieren <<EOF. Beachten Sie auch, dass die Aufgabe in Ihrem Beispiel einfacher von ausgeführt wird pgrep.
Kusalananda
Vielen Dank @Kusalananda. Es funktionierte wie ein Zauber.
Alok Tiwari