Jak podzielić wiersz zawierający podkreślenie za pomocą awk?

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

  • Czy tego chcesz: awk -F_ '{for(i=1;i<=NF;i++) print $i+0}' <<<"3302491505_8139829707_13970101.csv"?
  • nie chcę wydrukować tylko jednego z nich: 8139829707 lub 3302491505
  • jaki jest problem z wydrukowaniem pierwszego pola przy użyciu _ jako separator pól? Spróbuj trochę wysiłku

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]}" 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *