Mam tę linię, ale chcę, aby każda jej część była oddzielona i chcę, aby ta separacja była wykonywana za pomocą awk.
Oryginalna linia jest następująca:
3302491505_8139829707_13970101.csv
, a jako wyjście chcę otrzymać:
8139829707
lub to:
3302491505
Komentarze
Odpowiedź
Można to zrobić za pomocą cut:
$ cut -d_ -f2 <<< "3302491505_8139829707_13970101.csv" 8139829707
Odpowiedź
Spróbuj:
awk -F"[_.]" "{print $2; print $1}" <<< "3302491505_8139829707_13970101.csv"
-F
ustawia separator pól na _
lub .
. Pozwala ustawić pola $1
i $2
.
Komentarze
- to wypisuje całą linię
Odpowiedź
Spowoduje to wydrukowanie wszystkich części indywidualnie
$ awk -F"[_.]" "{print $1; print $2; print $3; print $4}" <<< "3302491505_8139829707_13970101.csv" 3302491505 8139829707 13970101 csv
Po prostu użyj żądanego pola.
$ awk -F"[_.]" "{ print $3;}" <<< "3302491505_8139829707_13970101.csv" 13970101
Odpowiedź
echo -n "3302491505_8139829707_13970101.csv" | awk -F"[._]" "{print $1}"
To jest rozdzielane przez _
lub .
a następnie wydrukuj potrzebne pole Po prostu wydrukuj
-
$1
dla pierwszego pola: 3302491505 -
$2
dla drugiego pola: 8139829707 -
$3
dla 3. pola: 13970101
Odpowiedź
Powłoki podobne do Bournea mają wbudowany sposób dzielenia ciągów. Tak właśnie się dzieje, gdy nie podajesz rozwinięcia parametru i jest źródłem tak wielu błędów, gdy nie chcesz, aby tak się stało.
Więc wydaje się uczciwe, jeśli tak jest potrzebne.
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"
Niektóre powłoki mają mniej uciążliwe sposoby dzielenia ciągów.
W zsh
:
var=3302491505_8139829707_13970101.csv non_empty_parts=(${(s:_:)var}) parts=("${(@s:_:)var}")
Lub bezpośrednio:
printf "%s\n" "Second part: ${${(s:_:)var}[2]}"
awk -F_ '{for(i=1;i<=NF;i++) print $i+0}' <<<"3302491505_8139829707_13970101.csv"
?_
jako separator pól? Spróbuj trochę wysiłku