Jeg har denne linje, men jeg vil have hver del af den adskilt, og jeg ønsker, at denne adskillelse skal ske med awk.
oprindelige linje er følgende:
3302491505_8139829707_13970101.csv
og hvad jeg vil have som output er:
8139829707
eller dette:
3302491505
Kommentarer
Svar
Dette kan gøres med cut:
$ cut -d_ -f2 <<< "3302491505_8139829707_13970101.csv" 8139829707
Svar
Prøv dette:
awk -F"[_.]" "{print $2; print $1}" <<< "3302491505_8139829707_13970101.csv"
-F
indstiller feltadskilleren til _
eller .
. Det giver mulighed for at indstille felterne $1
og $2
.
Kommentarer
- dette udskriver hele linjen
Svar
Dette udskriver alle dele individuelt
$ awk -F"[_.]" "{print $1; print $2; print $3; print $4}" <<< "3302491505_8139829707_13970101.csv" 3302491505 8139829707 13970101 csv
Brug bare det ønskede felt.
$ awk -F"[_.]" "{ print $3;}" <<< "3302491505_8139829707_13970101.csv" 13970101
Svar
echo -n "3302491505_8139829707_13970101.csv" | awk -F"[._]" "{print $1}"
Dette adskiller sig ved _
eller .
og udskriv derefter hvilket felt du har brug for Udskriv bare
-
$1
til første felt: 3302491505 -
$2
til 2. felt: 8139829707 -
$3
til 3. felt: 13970101
Svar
Bourne-lignende skaller har en indbygget måde at dele strenge på. Det er, hvad der sker, når du lader en parameterudvidelse være citeret, og kilden til så mange fejl, når du ikke ønsker, at det skal ske.
Så det virker kun rimeligt at bruge det, når det faktisk er nødvendigt.
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"
Nogle skaller har mindre besværlige måder at dele strenge 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? Lav en indsats