Ich habe eine große Datei mit Hunderten von Spalten, von denen ich nur die dritte und vierte Spalte entfernen möchte, und den Rest in eine Datei drucken. Meine ursprüngliche Idee war, ein awk-Skript wie awk '{print , , for (i=; i <= NF; i++) print $i }' file > outfile
zu erstellen. Dieser Code funktioniert jedoch nicht.
Ich habe es dann versucht:
%Vor% Aber das hat nur alles in einem Feld ausgedruckt. Es wäre möglich, dies in zwei Skripte aufzuteilen und sie mit unix paste
zu kombinieren, aber das scheint etwas zu sein, was in einer Zeile möglich sein sollte.
Dein erster Versuch war ziemlich nah. Es zu modifizieren, um printf
zu benutzen und die Feldseparatoren zu integrieren, funktionierte für mich:
Angenommen, Sie haben eine tab Datei mit Trennzeichen, die wie folgt aussieht:
temp.txt
MitFeld1 Feld2 Feld3 Feld4 Feld5 Feld6 Feld1 Feld2 Feld3 Feld4 Feld5 Feld6 Feld1 Feld2 Feld3 Feld4 Feld5 Feld6
wird das Feld 3 und 4 entfernt und am Zeilenende ausgegeben.
awk '{print "\t""\t"substr(
> newFile
, index(>> newFile
,))}' temp.txt
Feld1 Feld2 Feld5 Feld6
Feld1 Feld2 Feld5 Feld6
Feld1 Feld2 Feld5 Feld6
Mein Beispiel (s) wird in stdout gedruckt.
awk '{print "\t""\t"substr(
sendet stdout an newFile und %code% wird an newFile angehängt. cut -f1,2,5- temp.txt
, index(awk
,))}' temp.txt > newFile.txt
Vielleicht möchten Sie Folgendes verwenden:
%code%
Einige werden für Schnitt argumentieren
%code%
, die die gleiche Ausgabe erzeugen, und cut ist der Einfachheit halber groß, aber behandelt keine inkonsistenten Trennzeichen. Zum Beispiel eine Mischung verschiedener Whitespaces. In diesem Fall kann jedoch der Schnitt das sein, wonach Sie suchen.
Sie können dies auch in Perl, Python, Ruby und vielen anderen erreichen, aber hier ist die einfachste %code% -Lösung.
Was ist mit etwas wie:
%Vor%Es druckt die ersten beiden Spalten, überspringt die 3. und 4. Stelle und druckt dann von 5 bis zum Ende.
Ja, es ist möglich, die dritte und vierte Spalte auf eine leere Zeichenfolge zu setzen; Darüber hinaus sollte das Feld auf sich selbst gesetzt werden (
=
), damit awk
das Eingabefeldtrennzeichen (delimeter) :
für die gesamte aktuelle Zeile %code%
auf einmal verbraucht.
Die harte, aber generische Art (für einen einfachen oneliner zu vergessen)
%Vor%:
in der ersten Zeile