이 줄이 있지만 각 부분을 분리하고 싶고 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]}"