Bash - Nehmen Sie die n-te Spalte in einer Textdatei
Ich habe eine text-Datei:
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
Möchte ich dann die 2. und 4. Wort, jeder Zeile wie diese:
1657 19.6117
1410 18.8302
3078 18.6695
2434 14.0508
3129 13.5495
Ich bin mit diesem 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
Funktioniert es aber sehr kompliziert und dauert lange, bis die Bearbeitung langer text-Dateien.
Gibt es eine einfache Möglichkeit, dies zu tun?
Kommentar zu dem Problem
2. Wort, jeder Zeile genannt wird 2. Spalte einfach!
InformationsquelleAutor der Frage mnrl | 2013-06-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
iirc :
oder, wie erwähnt, in den Kommentaren :
InformationsquelleAutor der Antwort Tom van der Woerdt
Können Sie die
cut
Befehl:Drucke
den
-d' '
- bedeuten, verwenden Siespace
als Trennzeichen-f3,5
- nehmen und drucken 3. und 5. SpalteDen
cut
ist viel schneller für große Dateien als eine Reine shell Lösung. Wenn Sie Ihre Datei ist getrennt mit mehreren Leerzeichen, können Sie entfernen Sie Sie zuerst, wie:wo die (gnu) sed ersetzen
tab
oderspace
Zeichen mit einem einzigenspace
.Für eine Variante - hier ist eine perl-Lösung zu:
InformationsquelleAutor der Antwort jm666
Der Vollständigkeit halber:
Statt
_
eine beliebige variable (wiejunk
) können auch verwendet werden. Der Punkt ist nur das extrahieren der Spalten.Demo:
InformationsquelleAutor der Antwort Johannes Weiss
Wenn Ihre Datei enthält n Linien, dann hat Ihr Skript die Datei zu Lesen n mal; also wenn du die doppelte Länge der Datei, Sie vervierfachen, die Menge der Arbeit dein script macht — und fast alle, dass die Arbeit einfach weggeworfen, da alles, was Sie tun möchten, ist die Schleife über die Zeilen, um.
Statt, der beste Weg, um eine Schleife über die Zeilen einer Datei ist die Verwendung eines
while
- Schleife mit der Bedingung-Befehl wird dieread
builtin:In Ihrem Fall, da Sie teilen möchten, auf die Zeile in ein array, und die
read
builtin eigentlich hat spezielle Unterstützung für das Auffüllen der ein array-variable, die ist, was Sie wollen, können Sie schreiben:oder noch besser:
Jedoch, für das, was Sie tun, können Sie einfach die
cut
utility:(oder
awk
, wie Tom van der woerdt leitet schlägt, oderperl
oder sogarsed
).InformationsquelleAutor der Antwort ruakh
Eine weitere einfache Variante -
InformationsquelleAutor der Antwort AKA11
Wenn Sie mit strukturierten Daten, hat dies den zusätzlichen Vorteil, nicht den Aufruf einer extra-shell-Prozess ausgeführt
tr
- und/odercut
oder so etwas. ...(Natürlich, werden Sie wollen Schutz gegen schlecht-Eingänge mit Bedingungen und vernünftige alternativen.)
InformationsquelleAutor der Antwort ingyhere