Ich habe eine Textdatei:
1 Q0 1657 1 19.6117 Exp
1 Q0 1410 2 18.8302 Exp
2 Q0 3078 1 18.6695 Exp
2 Q0 2434 2 14.0508 Exp
2 Q0 3129 3 13.5495 Exp
Ich möchte das 2. und 4. Wort jeder Zeile so nehmen:
1657 19.6117
1410 18.8302
3078 18.6695
2434 14.0508
3129 13.5495
Ich benutze diesen Code:
nol=$(cat "/path/of/my/text" | wc -l)
x=1
while [ $x -le "$nol" ]
do
line=($(sed -n "$x"p /path/of/my/text)
echo ""${line[1]}" "${line[3]}"" >> out.txt
x=$(( $x + 1 ))
done
Es funktioniert, ist aber sehr kompliziert und die Verarbeitung langer Textdateien dauert lange.
Gibt es einen einfacheren Weg, dies zu tun?
Antworten:
iirc:
oder, wie in den Kommentaren erwähnt:
quelle
awk '{print $2,$4}' filename.txt
ist besser (keine Pipe, nur ein Programm aufgerufen)cat
in meinen Bash-Skripten, anstatt einen Dateinamen anzugeben, weil der Overhead minimal ist und weil die Syntaxcat ... | ... > ...
wirklich gut zeigt, was die Eingabe ist und wohin die Ausgabe geht. Sie haben Recht, es wird hier eigentlich nicht benötigt.< input awk '{ print $2 $4 }' > output
zu diesem Zweck.Sie können den folgenden
cut
Befehl verwenden:druckt
das
-d' '
- meine,space
als Trennzeichen verwenden-f3,5
- 3. und 5. Spalte nehmen und ausdruckenDas
cut
ist für große Dateien als reine Shell-Lösung viel schneller . Wenn Ihre Datei durch mehrere Leerzeichen begrenzt ist, können Sie diese zuerst entfernen, z. B.:wobei das (gnu) sed ein
tab
oder mehrerespace
Zeichen durch ein einzelnes ersetztspace
.Für eine Variante - hier ist auch eine Perl-Lösung:
quelle
Der Vollständigkeit halber:
Anstelle
_
einer beliebigen Variablen (wiejunk
) kann auch verwendet werden. Es geht nur darum, die Spalten zu extrahieren.Demo:
quelle
Noch eine einfache Variante -
quelle
Wenn Ihre Datei n Zeilen enthält , muss Ihr Skript die Datei n- mal lesen . Wenn Sie also die Länge der Datei verdoppeln, vervierfachen Sie den Arbeitsaufwand Ihres Skripts - und fast die gesamte Arbeit wird einfach weggeworfen, da Sie nur die Zeilen der Reihe nach durchlaufen möchten.
Der beste Weg, um die Zeilen einer Datei zu durchlaufen, ist die Verwendung einer
while
Schleife, wobei der Befehl condition der integrierte Befehl istread
:In Ihrem Fall
read
können Sie schreiben , da Sie die Zeile in ein Array aufteilen möchten und das integrierte System tatsächlich eine spezielle Unterstützung für das Auffüllen einer Array-Variablen bietet. Dies ist das, was Sie möchten:oder noch besser:
Für das, was Sie tun, können Sie jedoch einfach das
cut
Dienstprogramm verwenden:(oder
awk
, wie Tom van der Woerdt vorschlägt, oderperl
oder sogarsed
).quelle
read
über ,cut
weil es gegen mehrere Leerzeichen zwischen den Feldern robust ist und Sie nicht Array Magie benötigen:while read word1 word2 word3 word4 rest; do doSomethingWith $word2 $word4; done
Wenn Sie strukturierte Daten verwenden, hat dies den zusätzlichen Vorteil, dass kein zusätzlicher Shell-Prozess zum Ausführen
tr
und / oder Ausführen aufgerufen wirdcut
oder Ähnliches aufgerufen wird. ...(Natürlich sollten Sie sich mit Bedingungen und vernünftigen Alternativen vor schlechten Eingaben schützen.)
quelle