AWK – rozsah tisku sloupců

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 dva sed 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 …

  • @EdMorton ' stále doufám v jediné awk řešení …
  • @nath proč ? V čem je ' špatně řešení cut, které @drl zveřejnil ?
  • @EdMorton ne, máte pravdu, funguje to dobře. Myslel jsem si, že to s 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 🙂
  • Napsat komentář

    Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *