Mám tento řádek, ale chci, aby každá jeho část byla oddělena a chci, aby toto oddělení bylo provedeno pomocí awk.
původní řádek je následující:
3302491505_8139829707_13970101.csv
a to, co chci jako výstup, je:
8139829707
nebo toto:
3302491505
Komentáře
Odpověď
Lze to provést řezem:
$ cut -d_ -f2 <<< "3302491505_8139829707_13970101.csv" 8139829707
Odpověď
Zkuste toto:
awk -F"[_.]" "{print $2; print $1}" <<< "3302491505_8139829707_13970101.csv"
-F
nastaví oddělovač polí na _
nebo .
. Umožňuje nastavit pole $1
a $2
.
Komentáře
- toto vytiskne celý řádek
odpověď
Tím se vytisknou všechny části jednotlivě
$ awk -F"[_.]" "{print $1; print $2; print $3; print $4}" <<< "3302491505_8139829707_13970101.csv" 3302491505 8139829707 13970101 csv
Stačí použít požadované pole.
$ awk -F"[_.]" "{ print $3;}" <<< "3302491505_8139829707_13970101.csv" 13970101
Odpovědět
echo -n "3302491505_8139829707_13970101.csv" | awk -F"[._]" "{print $1}"
Toto je odděleno _
nebo .
a poté vytiskněte kterékoli pole, které potřebujete, stačí vytisknout
-
$1
pro první pole: 3302491505 -
$2
pro 2. pole: 8139829707 -
$3
pro 3. pole: 13970101
Odpověď
Bourneovské mušle mají vestavěný způsob rozdělení řetězců. To se stane, když necháte expanzi parametrů necitovanou a zdrojem tolik chyb, když si nepřejete, aby se to stalo.
Takže by se zdálo být spravedlivé použít ji, když je potřeba.
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"
Některé skořepiny mají méně těžkopádné způsoby rozdělení řetězců.
V zsh
:
var=3302491505_8139829707_13970101.csv non_empty_parts=(${(s:_:)var}) parts=("${(@s:_:)var}")
Nebo přímo:
printf "%s\n" "Second part: ${${(s:_:)var}[2]}"
awk -F_ '{for(i=1;i<=NF;i++) print $i+0}' <<<"3302491505_8139829707_13970101.csv"
?_
jako oddělovač polí? Vyvíjejte určité úsilí