Alle Felder außer aw in awk ausgeben

7

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.

    
Stedy 23.06.2011, 17:49
quelle

6 Antworten

9

Dein erster Versuch war ziemlich nah. Es zu modifizieren, um printf zu benutzen und die Feldseparatoren zu integrieren, funktionierte für mich:

%Vor%     
Carl Norum 23.06.2011, 17:57
quelle
6

Angenommen, Sie haben eine tab Datei mit Trennzeichen, die wie folgt aussieht:

temp.txt

  

Feld1 Feld2 Feld3 Feld4 Feld5 Feld6   Feld1 Feld2 Feld3 Feld4 Feld5 Feld6   Feld1 Feld2 Feld3 Feld4 Feld5 Feld6

Mit

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(cut -f1,2,5- temp.txt, index(awk,))}' temp.txt > newFile.txt sendet stdout an newFile und %code% wird an newFile angehängt.

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.

    
matchew 23.06.2011 18:13
quelle
6

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.

    
thomascirca 23.06.2011 18:15
quelle
0

Wie wäre es, wenn Sie die dritte und vierte Spalte auf eine leere Zeichenfolge setzen:

%Vor%     
jim 23.06.2011 18:04
quelle
0

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.

%Vor%     
progz 18.03.2013 12:59
quelle
0

Die harte, aber generische Art (für einen einfachen oneliner zu vergessen)

%Vor%
  • Sie können jedes Feld angeben, das Sie ausschließen möchten
    • Füllen Sie den Feldindex in Varail Ausschließen getrennt durch : in der ersten Zeile
  • Trennzeichen sind korrekt an Ort und Stelle
  • Code ist zum besseren Verständnis "erweitert"
  • Das Endergebnis ist nicht genau wie bei der Eingabe (ohne Ausschlussfeld), da das Ausgabetrennzeichen anstelle des Originaltrennzeichens verwendet wird (z. B. 2 Leerzeichen oder eine Registerkarte wird auf 1 Leerzeichen mit Standardverhalten geändert)
NeronLeVelu 06.08.2015 08:19
quelle

Tags und Links