AWK – az oszlopok tartományának nyomtatása

ha a következő formátumú csv fájlom van:

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

és szeretném, ha a awk csak a 2–7. oszlopokat nyomtatná, amelyeket használnék:

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

és get:

column2,column3,column4,column5,column6,column7 

van-e mód a 2-7. oszlop összefűzésére a parancs egyszerűsítése érdekében. Ha egy kicsit több oszloppal rendelkező fájlra gondolok, a awk parancsom rettenetesen hosszú lesz.

Megjegyzések

  • mindig akarsz egymás után következő oszlopkészletet (pl. 2-7, 5-15 vagy bármi más)? Ha igen, akkor egy hurok segítségével kinyomtathatod az oszlopokat. Ha nem, akkor ' s nem kerülheti el a kívánt oszlopok felsorolását (bár szükség esetén összekeverhet néhány hurkot). Hány oszlopot is?
  • Végül érdemes lehet megfontolni egy olyan nyelvet, mint a perl vagy a python, jó CSV-elemzővel …. főleg, ha az első sorban oszlopnevek vannak (a perl ' s CSV-elemző modulok közül több is használható ezek egy hash szerkesztéséhez kulcsokként az oszlopnevekkel. i ' m nagyon biztos, hogy a python ' s CSV-elemzők hasonlót tudnak csinálni). kiváló tömb & hash-illesztési operátorokkal rendelkezik.
  • @ces igen, az oszlopok alwa-k lennének egymást követő.
  • Ez megválaszolja a kérdését? Az oszlopok tartományát vesszővel elválasztva, a többit vesszővel elválasztva

Válasz

$ 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 = kezdő mező száma, e = befejező mező száma. Ha idézett mezőkkel, beágyazott vesszőkkel, új sorokkal stb. Kell kezelnie a CSV-ket, akkor lásd: https://stackoverflow.com/q/45420535/1745001 .

Válasz

A segédprogram kivágása kompakt jelöléssel rendelkezik:

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

termelés:

2. oszlop, 3. oszlop, 4. oszlop, 5. oszlop, 6. oszlop, 7. oszlop

Válasz @PlasmaBinturong megjegyzésére: szándékomban állt egy rövid hívássorozat kérdésével foglalkozni: " … az awk parancsom rettenetesen hosszú lesz … ". Találhat azonban olyan kódokat is, amelyek elrendezik a mezőket, ahogyan azt kívánja. Bármennyire is szeretem az awk, a perl, a python programokat, gyakran hasznosnak találtam egy speciális segédprogram felépítését a standard * nix képességeinek kibővítéséhez. Tehát itt van egy kivonat az s2 teszt szkriptből, amely bemutatja a segédprogramok újrakezdését és elrendezését, lehetővé téve az újrarendezést és a másolást, az elrendezés pedig a csökkenő mezőtartományokat is lehetővé teszi:

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 

eredményeket produkál a következő verziókból:

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 

A my-recut egy kis módosítás a textutils kód recut-jában, és a rendez egy kiterjesztett kivágásunk verziója . További információ:

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 

Üdvözlettel … éljenzés, drl

megjegyzések

  • Az Awk-val ellentétben az oszlopokat a bemeneti fájl sorrendjében adja ki, nem a parancs sorrendjében.
  • @PlasmaBinturong – lásd a szerkesztett választ … éljenzés

Válasz

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 

Eredmények:

column2,column3,column4,column5,column6,column7 

Válasz

Az alábbi paranccsal tesztelve, és jól működött

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

output

column2,column3,column4,column5,column6,column7 

Megjegyzések

  • köszönöm a választ, jól működik a " o " az első sed cső előtt 🙂 össze lehet összefűzni a két sed parancsot: sed "s/^,//g; s/,$//g"
  • Miért teszteli a

hogy eldöntse, kiírja-e a sort vagy sem? Vannak más kérdések is (pl. NEM kellenek csövek a parancsok elcsendesítéséhez, amikor ' az awk-t használja!), De ennek az OFS tesztrésznek semmi értelme …

  • @EdMorton I ' m még mindig csak egy awk szennyezés reményében reménykedem …
  • @nath miért ? Mi ' hibás a cut megoldással, amelyet @drl tett közzé ?
  • @EdMorton nem igazad van, jól működik. Úgy gondoltam, hogy ez nem lehet túl bonyolult a awk alkalmazással, és inkább az érdeklődésre volt kíváncsi, akkor technikai okokból 🙂
  • Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük