awk를 사용하여 밑줄이 포함된 줄을 분할하는 방법은 무엇입니까?

awk를 사용하여 밑줄이 포함된 줄을 분할하는 방법은 무엇입니까?

이 줄이 있지만 각 부분을 분리하고 싶고 awk를 사용하여 이 분리를 수행하고 싶습니다.

원래 줄은 다음과 같습니다.

3302491505_8139829707_13970101.csv

내가 원하는 출력은 다음과 같습니다.

8139829707

아니면 이거:

3302491505

답변1

컷을 사용하여 이 작업을 수행할 수 있습니다.

$ cut -d_ -f2 <<< "3302491505_8139829707_13970101.csv" 
8139829707

답변2

이 시도:

awk -F'[_.]' '{print $2; print $1}'  <<< "3302491505_8139829707_13970101.csv" 

-F필드 구분 기호를 _또는 로 설정하십시오 .. 필드 $1$2.

답변3

그러면 모든 부품이 개별적으로 인쇄됩니다.

$ awk -F'[_.]' '{print $1; print $2; print $3; print $4}'  <<< "3302491505_8139829707_13970101.csv"
3302491505
8139829707
13970101
csv

원하는 필드를 사용하면 됩니다.

$ awk -F'[_.]' '{ print $3;}'  <<< "3302491505_8139829707_13970101.csv"
13970101

답변4

Bourne과 같은 쉘에는 문자열을 분할하는 방법이 내장되어 있습니다. 이는 인용되지 않은 인수가 확장될 때 발생하는 일이며, 이를 원하지 않을 때 너무 많은 오류가 발생합니다.

따라서 실제로 필요할 때만 사용하는 것이 공정한 것 같습니다.

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"

일부 쉘에는 문자열을 분할하는 덜 번거로운 방법이 있습니다.

존재하다 zsh:

var=3302491505_8139829707_13970101.csv
non_empty_parts=(${(s:_:)var})
parts=("${(@s:_:)var}")

또는 직접적으로:

printf '%s\n' "Second part: ${${(s:_:)var}[2]}"

관련 정보