AWK – Druckbereich der Spalten

, wenn ich eine CSV-Datei im folgenden Format habe:

column1,column2,column3,column4,column5,column6,column7,column8 

und ich möchte, dass awk nur die Spalten 2 bis 7 druckt, die ich verwenden würde:

awk -F"," "{print $2 "," $3 "," $4 "," $5 "," $6 "," $7}" file.csv 

und get:

column2,column3,column4,column5,column6,column7 

gibt es eine Möglichkeit, die Spalten 2-7 zu verketten, um den Befehl zu vereinfachen. Da ich an eine Datei mit viel mehr Spalten denke, würde mein Befehl awk furchtbar lang werden.

Kommentare

  • Wollen Sie immer einen aufeinanderfolgenden Satz von Spalten (z. B. 2-7 oder 5-15 oder was auch immer)? Wenn ja, können Sie die Spalten mit einer Schleife drucken. Wenn nicht, gibt es ' Es ist nicht zu vermeiden, die einzelnen Spalten aufzulisten, die Sie möchten (obwohl Sie bei Bedarf einige Schleifen einmischen können). Außerdem, wie viele Spalten?
  • Schließlich möchten Sie vielleicht Um eine Sprache wie Perl oder Python mit einem guten CSV-Parser in Betracht zu ziehen, insbesondere wenn Sie die Spaltennamen in der ersten Zeile haben (mehrere der CSV-Parsing-Module von perl ' können verwendet werden diese, um einen Hash mit den Spaltennamen als Schlüssel zu erstellen. i ' Ich bin mir ziemlich sicher, dass die CSV-Parser von Python ' ähnliche Aktionen ausführen können hat auch ausgezeichnete Array & Hash-Spleißoperatoren.
  • @cas ja, die Spalten wären immer ys aufeinanderfolgend.
  • Beantwortet dies Ihre Frage? Druckbereich von Spalten, die durch Kommas getrennt sind, und der Rest ohne Komma-Trennung

Antwort

$ awk -v b=2 -v e=7 "BEGIN{FS=OFS=","} {for (i=b;i<=e;i++) printf "%s%s", $i, (i<e ? OFS : ORS)}" file column2,column3,column4,column5,column6,column7 

b = Anfangsfeldnummer, e = Endfeldnummer. Wenn Sie CSVs mit Anführungszeichen, eingebetteten Kommas, Zeilenumbrüchen usw. verarbeiten müssen, lesen Sie https://stackoverflow.com/q/45420535/1745001 .

Antwort

Der Utility-Schnitt hat eine kompakte Notation:

cut -d, -f2-7 <input-file> 

erzeugt:

Spalte2, Spalte3, Spalte4, Spalte5, Spalte6, Spalte7

Beantwortung des Kommentars von @PlasmaBinturong: Meine Absicht war es, das Problem einer kurzen Aufrufsequenz zu lösen: " … mein Befehl awk würde schrecklich lang werden … ". Man kann jedoch auch Codes finden, die die Felder nach Belieben anordnen. So sehr ich awk, perl, python mag, habe ich es oft als nützlich empfunden, ein bestimmtes Dienstprogramm zu erstellen, um die Funktionen von Standard * nix zu erweitern. Hier ist ein Auszug aus einem Testskript, s2, das zeigt, wie Dienstprogramme neu geschnitten und angeordnet werden. Beide ermöglichen eine Neuanordnung und Vervielfältigung, wobei die Anordnung auch abnehmende Feldbereiche zulässt:

FILE=${1-data1} # Utility functions: print-as-echo, print-line-with-visual-space. pe() { for _i;do printf "%s" "$_i";done; printf "\n"; } pl() { pe;pe "-----" ;pe "$*"; } pl " Input data file $FILE:" head $FILE pl " Results, cut:" cut -d, -f2-7 $FILE pl " Results, recut (modified as my-recut):" my-recut -d "," 7,6,2-5 < $FILE pl " Results, arrange:" arrange -s "," -f 5,3-1,7,5,3-4,5 $FILE 

Ergebnisse aus diesen Versionen erzeugen:

OS, ker|rel, machine: Linux, 3.16.0-10-amd64, x86_64 Distribution : Debian 8.11 (jessie) bash GNU bash 4.3.30 cut (GNU coreutils) 8.23 recut - ( local: RepRev 1.1, ~/bin/recut, 2010-06-10 ) arrange (local) 1.15 ----- Input data file data1: column1,column2,column3,column4,column5,column6,column7,column8 ----- Results, cut: column2,column3,column4,column5,column6,column7 ----- Results, recut (modified as my-recut): column7,column6,column2,column3,column4,column5 ----- Results, arrange: column5,column3,column2,column1,column7,column5,column3,column4,column5 

Der my-recut ist eine geringfügige Modifikation des textutils-Code-Nachschneidens, und arrangieren Sie unsere Version eines erweiterten Schnitts . Weitere Informationen:

recut Process fields like cut, allow repetitions and re-ordering. (what) Path : ~/bin/recut Version : - ( local: RepRev 1.1, ~/bin/recut, 2010-06-10 ) Length : 56 lines Type : Perl script, ASCII text executable Shebang : #!/usr/bin/perl Home : http://www1.cuni.cz/~obo/textutils/ (doc) Modules : (for perl codes) Getopt::Long 2.42 arrange Arrange fields, like cut, but in user-specified order. (what) Path : ~/bin/arrange Version : 1.15 Length : 355 lines Type : Perl script, ASCII text executable Shebang : #!/usr/bin/perl Modules : (for perl codes) warnings 1.23 strict 1.08 Carp 1.3301 Getopt::Euclid 0.4.5 

Alles Gute … Prost, drl

Kommentare

  • Im Gegensatz zu Awk werden die Spalten in der Reihenfolge der Eingabedatei und nicht in der Reihenfolge des Befehls ausgegeben.
  • @PlasmaBinturong – siehe bearbeitete Antwort … Prost

Antwort

sed -e " s/,/\n/7 ;# tag the end of col7 s/^/,/ ;# add a comma s/,/\n/2 ;# tag beginning of col2 s/.*\n\(.*\)\n.*/\1/ ;# perform surgery " file.csv 

Ergebnisse:

column2,column3,column4,column5,column6,column7 

Antwort

Getestet mit dem folgenden Befehl und es hat gut funktioniert

awk -F "," "OFS=","{$1="";$NF="";print $0}" o| sed "s/^,//g"|sed "s/,$//g" 

Ausgabe

column2,column3,column4,column5,column6,column7 

Kommentare

  • Danke für die Antwort, funktioniert gut ohne die " o " vor der ersten sed -Pipe 🙂 könnte man die beiden sed -Befehle zu einem verketten: sed "s/^,//g; s/,$//g"
  • Warum testen Sie das Ergebnis der Ausführung von

um zu entscheiden, ob die Zeile gedruckt werden soll oder nicht? Es gibt auch andere Probleme (z. B. benötigen Sie KEINE Pipes zu sed-Befehlen, wenn Sie ' awk verwenden!), Aber dieser OFS-Testteil macht absolut keinen Sinn …

  • @EdMorton Ich ' hoffe immer noch auf eine einzige awk sollution …
  • @nath warum ? Was ' ist falsch an der cut -Lösung, die @drl veröffentlicht hat ?
  • @EdMorton Nein, Sie haben Recht, es funktioniert gut. Ich dachte, es könnte mit awk nicht zu kompliziert sein und war eher aus technischen Gründen neugierig auf das Interessante 🙂
  • Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.