, 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 beidensed
-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 …
awk
sollution … cut
-Lösung, die @drl veröffentlicht hat ? awk
nicht zu kompliziert sein und war eher aus technischen Gründen neugierig auf das Interessante 🙂