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
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]}"
awk -F_ '{for(i=1;i<=NF;i++) print $i+0}' <<<"3302491505_8139829707_13970101.csv"
?_
kentän erottimena? Tee vaivaa