Jeg har denne linjen, men jeg vil at hver del av den skal skilles, og jeg vil at denne separasjonen skal gjøres med awk.
originallinjen er følgende:
3302491505_8139829707_13970101.csv
og det jeg vil ha som utdata er:
8139829707
eller dette:
3302491505
Kommentarer
Svar
Dette kan gjøres med kutt:
$ cut -d_ -f2 <<< "3302491505_8139829707_13970101.csv" 8139829707
Svar
Prøv dette:
awk -F"[_.]" "{print $2; print $1}" <<< "3302491505_8139829707_13970101.csv"
-F
setter feltskilleren til _
eller .
. Det gjør det mulig å angi feltene $1
og $2
.
Kommentarer
- dette skriver ut hele linjen
Svar
Dette skriver ut alle delene individuelt
$ awk -F"[_.]" "{print $1; print $2; print $3; print $4}" <<< "3302491505_8139829707_13970101.csv" 3302491505 8139829707 13970101 csv
Bare bruk feltet du vil ha.
$ awk -F"[_.]" "{ print $3;}" <<< "3302491505_8139829707_13970101.csv" 13970101
Svar
echo -n "3302491505_8139829707_13970101.csv" | awk -F"[._]" "{print $1}"
Dette skiller seg fra _
eller .
og skriv ut hvilket felt du trenger Bare skriv ut
-
$1
for første felt: 3302491505 -
$2
for 2. felt: 8139829707 -
$3
for 3. felt: 13970101
Svar
Bourne-lignende skjell har en innebygd måte å dele strenger på. Det er det som skjer når du lar en parameterutvidelse være sitert, og kilden til så mange feil når du ikke vil at det skal skje.
Så det virker bare rettferdig å bruke det når det faktisk er nødvendig.
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"
Noen skjell har mindre tungvint måter å dele strenger på.
I zsh
:
var=3302491505_8139829707_13970101.csv non_empty_parts=(${(s:_:)var}) parts=("${(@s:_:)var}")
Eller direkte:
printf "%s\n" "Second part: ${${(s:_:)var}[2]}"
awk -F_ '{for(i=1;i<=NF;i++) print $i+0}' <<<"3302491505_8139829707_13970101.csv"
?_
som feltseparator? Gjør litt innsats