Kuinka voin jakaa rivin, joka sisältää alleviivatun, awk: llä?

Minulla on tämä rivi, mutta haluan, että kaikki sen osat erotetaan ja haluan, että tämä erotus tehdään awk: llä.

alkuperäinen rivi on seuraava:

3302491505_8139829707_13970101.csv 

ja mitä haluan lähdöksi:

8139829707 

tai tämä:

3302491505 

kommentit

  • haluatko tämän: awk -F_ '{for(i=1;i<=NF;i++) print $i+0}' <<<"3302491505_8139829707_13970101.csv"?
  • ei haluan tulostaa vain yhden niistä: 8139829707 tai 3302491505
  • mikä ongelma on 1. kentän tulostamisessa käyttämällä _ kentän erottimena? Tee vaivaa

Vastaa

Tämä voidaan tehdä leikkaamalla:

$ cut -d_ -f2 <<< "3302491505_8139829707_13970101.csv" 8139829707 

Vastaa

Kokeile tätä:

awk -F"[_.]" "{print $2; print $1}" <<< "3302491505_8139829707_13970101.csv" 

-F asettaa kentän erottimen arvoksi _ tai .. Sen avulla voidaan määrittää kentät $1 ja $2.

Kommentit

  • tämä tulostaa koko rivin

vastaus

Tämä tulostaa kaikki osat yksittäin

$ awk -F"[_.]" "{print $1; print $2; print $3; print $4}" <<< "3302491505_8139829707_13970101.csv" 3302491505 8139829707 13970101 csv 

Käytä vain haluamaasi kenttää.

$ awk -F"[_.]" "{ print $3;}" <<< "3302491505_8139829707_13970101.csv" 13970101 

Vastaa

echo -n "3302491505_8139829707_13970101.csv" | awk -F"[._]" "{print $1}" 

Tämä erottaa _ tai . ja tulosta sitten tarvitsemasi kenttä. Tulosta vain

  • $1 ensimmäiselle kentälle: 3302491505
  • $2 toiselle kentälle: 8139829707
  • $3 kolmannelle kentälle: 13970101

Vastaus

Bournen kaltaisilla kuorilla on sisäänrakennettu tapa jakaa merkkijonoja. Sitä tapahtuu, kun jätät parametrilaajennuksen noteeraamatta ja niin monen virheen lähteen, kun et halua sen tapahtuvan.

Joten tuntuu oikeudenmukaiselta käyttää sitä, kun se todella tapahtuu tarvitaan.

IFS=_ # split on _ set -o noglob # leaving a parameter expansion unquoted also # involves filename generation which we don"t want here var=3302491505_8139829707_13970101.csv set -- $var # $var unquoted means its split printf "%s: %s\n" First "$1" Second "$2" Third "$3" 

Joillakin kuoreilla on vähemmän hankalia tapoja jakaa merkkijonoja.

zsh:

var=3302491505_8139829707_13970101.csv non_empty_parts=(${(s:_:)var}) parts=("${(@s:_:)var}") 

Tai suoraan:

printf "%s\n" "Second part: ${${(s:_:)var}[2]}" 

Vastaa

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