AWK – tulosta sarakkeiden alue

jos minulla on csv-tiedosto seuraavassa muodossa:

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

ja haluan awk tulostaa vain sarakkeet 2–7, joita käytän:

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

ja get:

column2,column3,column4,column5,column6,column7 

onko tapaa liittää sarakkeet 2-7 komennon yksinkertaistamiseksi. Kun ajattelen tiedostoa, jossa on hieman enemmän sarakkeita, awk -komennoni piti kauheasti pitkä.

Kommentit

  • aiotko aina peräkkäisiä sarakkeita (esim. 2-7, 5-15 tai mitä tahansa)? jos on, voit käyttää silmukkaa sarakkeiden tulostamiseen. Jos ei, niin ' s ei välttämättä välttämättä listata yksittäisiä sarakkeita (vaikka voit sekoittaa joitain silmukoita tarvittaessa). Kuinka monta saraketta?
  • Lopuksi, haluat ehkä harkita kieltä, kuten perl tai python, jolla on hyvä CSV-jäsennin … varsinkin jos sinulla on sarakkeiden nimet ensimmäisellä rivillä (useat perl ' CSV-jäsentämoduulit voivat käyttää nämä rakentavat hash -sarakkeen, jonka sarakkeiden nimet ovat avaimia. i ' m melko varma, että python ' s CSV-jäsentimet voivat tehdä samanlaisia). perl on myös erinomaiset taulukon & hash-liitosoperaattorit.
  • @cas kyllä sarakkeet olisivat alwa ys peräkkäin.
  • Vastaako tämä kysymykseesi? Tulosta sarakkeiden alue pilkulla erotettuna ja loput ilman pilkkuerotusta

Vastaa

$ 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 = alkukentän numero, e = loppukentän numero. Jos sinun on käsiteltävä CSV-tiedostoja, joissa on lainatut kentät, upotetut pilkut, uudet viivat jne., Katso https://stackoverflow.com/q/45420535/1745001 .

Vastaus

Apuohjelman leikkauksessa on tiivis merkintätapa:

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

tuottaa:

sarake2, sarake3, sarake4, sarake5, sarake6, sarake7

Vastaamalla @PlasmaBinturongin kommenttiin: aikomuksenani oli ratkaista lyhyt soittosekvenssi: " … awk-komentoni piti kauheasti pitkän … ". Voidaan kuitenkin löytää myös koodeja, jotka järjestävät kentät haluamallasi tavalla. Niin paljon kuin pidän awk: stä, perl: stä, pythonista, olen usein pitänyt hyödyllisenä rakentaa erityinen apuohjelma tavallisen * nixin ominaisuuksien laajentamiseksi. Joten tässä on ote testikomentosarjasta s2, joka näyttää apuohjelmien uudelleenkäynnistämisen ja järjestämisen, sekä uudelleenjärjestelyn että kopioinnin, järjestelyn sallien myös pienenevät kenttäalueet:

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 

tuottaa tuloksia näistä versioista:

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 on pieni muutos textutils-koodin uudelleenlukemisessa, ja järjestely on meidän versio laajennetusta leikkauksesta . Lisätietoja:

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 

Ystävällisin terveisin … hurraa, drl

Kommentit

  • Päinvastoin kuin Awk, se tuottaa sarakkeet syötetiedoston järjestyksessä, ei komennon järjestyksessä.
  • @PlasmaBinturong – katso muokattu vastaus … hurraa

vastaus

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 

Tulokset:

column2,column3,column4,column5,column6,column7 

vastaus

Testattu alla olevalla komennolla ja se toimi hyvin

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

lähtö

column2,column3,column4,column5,column6,column7 

Kommentit

  • kiitos vastauksesta, toimii hyvin ilman " o " ennen ensimmäistä sed -putkea 🙂 voitaisiin liittää kaksi komentoa sed yhdeksi: sed "s/^,//g; s/,$//g"
  • Miksi testaat

päättää, tulostetaanko viiva vai ei? On muitakin asioita (esim. EI tarvita putkia komentojen sammuttamiseen, kun ' käytetään uudelleen awk!), Mutta sillä OFS-testiosalla ei ole mitään järkeä …

  • @EdMorton I ' m toivon edelleen vain awk saastumista …
  • @nath miksi ? Mikä ' vikaa cut -ratkaisulla, jonka @drl lähetti ?
  • @EdMorton ei, olet oikeassa, se toimii hyvin. Luulin, että se ei voi olla liian monimutkainen awk kanssa, ja olin utelias mielenkiintoisen asian suhteen sitten teknisistä syistä 🙂
  • Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *