Jag har den här raden, men jag vill att varje del av den ska separeras och jag vill att den här separationen ska göras med awk.
originalrad är följande:
3302491505_8139829707_13970101.csv
och vad jag vill ha som utdata är:
8139829707
eller detta:
3302491505
Kommentarer
Svar
Detta kan göras med klipp:
$ cut -d_ -f2 <<< "3302491505_8139829707_13970101.csv" 8139829707
Svar
Prova detta:
awk -F"[_.]" "{print $2; print $1}" <<< "3302491505_8139829707_13970101.csv"
-F
sätter fältseparatorn till _
eller .
. Det gör det möjligt att ställa in fälten $1
och $2
.
Kommentarer
- detta skriver ut hela raden
Svar
Detta skriver ut alla delar individuellt
$ awk -F"[_.]" "{print $1; print $2; print $3; print $4}" <<< "3302491505_8139829707_13970101.csv" 3302491505 8139829707 13970101 csv
Använd bara det fält du vill ha.
$ awk -F"[_.]" "{ print $3;}" <<< "3302491505_8139829707_13970101.csv" 13970101
Svar
echo -n "3302491505_8139829707_13970101.csv" | awk -F"[._]" "{print $1}"
Detta skiljer sig från _
eller .
och skriv ut vilket fält du behöver. Skriv bara ut
-
$1
för första fältet: 3302491505 -
$2
för andra fältet: 8139829707 -
$3
för tredje fältet: 13970101
Svar
Bourne-liknande skal har ett inbyggt sätt att dela strängar. Det är vad som händer när du lämnar en parameterutvidgning ociterad och källan till så många fel när du inte vill att det ska hända.
Så det verkar bara rättvist att använda det när det faktiskt är behövs.
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"
Vissa skal har mindre besvärliga sätt att dela strängar.
I zsh
:
var=3302491505_8139829707_13970101.csv non_empty_parts=(${(s:_:)var}) parts=("${(@s:_:)var}")
Eller direkt:
printf "%s\n" "Second part: ${${(s:_:)var}[2]}"
awk -F_ '{for(i=1;i<=NF;i++) print $i+0}' <<<"3302491505_8139829707_13970101.csv"
?_
som fältseparator? Gör en ansträngning