pokud mám soubor CSV v následujícím formátu:
column1,column2,column3,column4,column5,column6,column7,column8
a chci, aby awk
tiskl pouze sloupce 2 až 7, které bych použil:
awk -F"," "{print $2 "," $3 "," $4 "," $5 "," $6 "," $7}" file.csv
a get:
column2,column3,column4,column5,column6,column7
existuje způsob, jak zřetězit sloupce 2-7 pro zjednodušení příkazu. Když přemýšlím o souboru s mnohem více sloupci, můj příkaz awk
by byl strašně dlouhý.
Komentáře
- budete vždy chtít po sobě jdoucí sadu sloupců (např. 2-7 nebo 5-15 nebo cokoli jiného)? pokud ano, můžete k vytištění sloupců použít smyčku. Pokud ne, tam ' s nevyhýbáním se seznamu jednotlivých sloupců, které chcete (i když je to možné, můžete podle potřeby kombinovat několik smyček). Kolik sloupců také chcete?
- Nakonec možná budete chtít zvážit jazyk jako perl nebo python s dobrým analyzátorem CSV …. zvláště pokud máte v prvním řádku názvy sloupců (několik modulů pro analýzu CSV perl ' může použít pomocí nich lze vytvořit hash s názvy sloupců jako klíče. i ' m docela jistý, že python ' s CSV parsery mohou dělat podobné). perl má také vynikající operátory pole & hash sestřihu.
- @cas ano, sloupce by byly alwa ys po sobě jdoucí.
- Odpovídá to na vaši otázku? Tisknout rozsah sloupců oddělených čárkami a zbytek bez oddělení čárkami
Odpovědět
$ 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 = počáteční číslo pole, e = číslo koncového pole. Pokud potřebujete zpracovat soubory CSV s uvozovkami, vloženými čárkami, novými řádky atd., Přečtěte si https://stackoverflow.com/q/45420535/1745001 .
Odpověď
Řez obslužného programu má kompaktní notaci:
cut -d, -f2-7 <input-file>
produkce:
sloupec2, sloupec3, sloupec4, sloupec5, sloupec6, sloupec7
Odpověď na komentář od @PlasmaBinturong: mým záměrem bylo vyřešit problém krátké volací sekvence: " … můj příkaz awk by byl strašně dlouhý … ". Lze však také najít kódy, které uspořádají pole podle přání. Jakkoli se mi líbí awk, perl, python, často mi připadalo užitečné vybudovat specifický nástroj pro rozšíření schopností standardního * nix. Tady je tedy výňatek z testovacího skriptu s2, který ukazuje, jak nástroje přeformátují a uspořádají, jak umožňují opětovné uspořádání a duplikaci, přičemž uspořádáním také umožňují zmenšovat rozsahy polí:
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
Produkce výsledků z těchto verzí:
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
My-recut je drobná modifikace recut kódu textutils a uspořádat je naše verze rozšířeného střihu . Další informace:
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
Všechno nejlepší … na zdraví, drl
Komentáře
- Na rozdíl od Awk vydává sloupce v pořadí vstupního souboru, nikoli v pořadí příkazu.
- @PlasmaBinturong – viz upravená odpověď … na zdraví
Odpověď
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
Výsledky:
column2,column3,column4,column5,column6,column7
Odpovědět
Testováno pomocí níže uvedeného příkazu a fungovalo to dobře
awk -F "," "OFS=","{$1="";$NF="";print $0}" o| sed "s/^,//g"|sed "s/,$//g"
výstup
column2,column3,column4,column5,column6,column7
Komentáře
- děkuji za odpověď, funguje bez " o " před první
sed
rourou 🙂 bylo by možné spojit dvased
příkazy do jednoho:sed "s/^,//g; s/,$//g"
- Proč testujete výsledek provedení
rozhodnout, zda řádek vytisknout nebo ne? Existují i další problémy (např. Když ' znovu používáte awk!, Nepotřebujete příkazy potrubí k sednutí), ale testovací část OFS nedává absolutně žádný smysl …
awk
řešení … cut
, které @drl zveřejnil ? awk
nemůže být příliš komplikované, a byl jsem zvědavý spíše na věc zájmu než z technického důvodu 🙂