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

関連情報