カテゴリー
【Awk & Jq活用講座】 文字列の分割を分割を極める ~ split関数の使い方
※ 当ページには【広告/PR】を含む場合があります。
2021/04/01
はじめに
データファイルのsplit(分割)の基礎
$ cat << EOF > testdata.ssv
山下モゲ雄 営業部 本社 3年
島田フガ子 経理部 名古屋支部 15年
岡田ピポ太 製造部 山口工場 8年
沢口モフ代 人事部 本社 4年
銭形ガメ吉 海外部 メキシコ支部 11年
EOF
$ cat << EOF > testdata.asv
山下モゲ雄&営業部&本社&3年
島田フガ子&経理部&名古屋支部&15年
岡田ピポ太&製造部&山口工場&8年
沢口モフ代&人事部&本社&4年
銭形ガメ吉&海外部&メキシコ支部&11年
EOF
Awkでsplitする場合
-F
-F","
#👇区切り文字がスペース文字の場合には-F" "は省略可
$ awk -F" " 'BEGIN{ OFS="," } {
print $1,$2,$3,$4;
}' testdata.ssv
#👇Csvで出力
山下モゲ雄,営業部,本社,3年
島田フガ子,経理部,名古屋支部,15年
岡田ピポ太,製造部,山口工場,8年
沢口モフ代,人事部,本社,4年
銭形ガメ吉,海外部,メキシコ支部,11年
$ awk -F"&" 'BEGIN{ OFS="," } {
print $1,$2,$3,$4;
}' testdata.asv
#👇Csvで出力
山下モゲ雄,営業部,本社,3年
島田フガ子,経理部,名古屋支部,15年
岡田ピポ太,製造部,山口工場,8年
沢口モフ代,人事部,本社,4年
銭形ガメ吉,海外部,メキシコ支部,11年
FS
$ awk '
BEGIN {
FS=" "; OFS=",";
} {
print $1,$2,$3,$4;
}' testdata.ssv
#👇Csvで出力
山下モゲ雄,営業部,本社,3年
島田フガ子,経理部,名古屋支部,15年
岡田ピポ太,製造部,山口工場,8年
沢口モフ代,人事部,本社,4年
銭形ガメ吉,海外部,メキシコ支部,11年
$ awk '
BEGIN {
FS="&"; OFS=",";
} {
print $1,$2,$3,$4;
}' testdata.asv
#👇Csvで出力
山下モゲ雄,営業部,本社,3年
島田フガ子,経理部,名古屋支部,15年
岡田ピポ太,製造部,山口工場,8年
沢口モフ代,人事部,本社,4年
銭形ガメ吉,海外部,メキシコ支部,11年
複雑なセパレーターの設定
-F
FS
$ awk '
BEGIN {
FS="[ ,+&$-/]"; OFS=",";
} {
print $1,$2,$3,$4;
}' << EOF
山下モゲ雄+営業部&本社/3年
島田フガ子,経理部-名古屋支部,15年
岡田ピポ太,製造部-山口工場,8年
沢口モフ代$人事部 本社&4年
銭形ガメ吉/海外部$メキシコ支部+11年
EOF
#👇Csvで出力
山下モゲ雄,営業部,本社,3年
島田フガ子,経理部,名古屋支部,15年
岡田ピポ太,製造部,山口工場,8年
沢口モフ代,人事部,本社,4年
銭形ガメ吉,海外部,メキシコ支部,11年
$ awk '
BEGIN {
FS="[ ,+&-$/]"; OFS=",";
} {
print $1,$2,$3,$4;
}' << EOF
山下モゲ雄+営業部&本社/3年
島田フガ子,経理部-名古屋支部,15年
岡田ピポ太,製造部-山口工場,8年
沢口モフ代$人事部 本社&4年
銭形ガメ吉/海外部$メキシコ支部+11年
EOF
#👇Csvで出力
awk: bad regex '[ ,+&-$/]': Invalid character range
Jqでsplitする場合
split(文字列):
セパレーター(区切り位置)となる文字列で分割した文字列を配列として返す。
引数の文字列は正規表現ではないので注意
split(パターン; フラグ):
上のsplit(文字列)メソッドの正規表現拡張版。
フラグを指定することでこちらの関数が識別される。
返り値として分割された文字列の配列が返される
splits(パターン)もしくはsplits(パターン; フラグ):
上のsplit(パターン; フラグ)と作用は同じだが、
返り値として文字列の配列ではなく、ストリームが返される
split(文字列)
split(パターン; フラグ)
split(文字列)
split(文字列)
$ jq -s -R '
[ split("\n")[] | select(length > 0) | split(" ") ]
' testdata.ssv
#👇配列として表示
[
[
"山下モゲ雄",
"営業部",
"本社",
"3年"
],
[
"島田フガ子",
"経理部",
"名古屋支部",
"15年"
],
[
"岡田ピポ太",
"製造部",
"山口工場",
"8年"
],
[
"沢口モフ代",
"人事部",
"本社",
"4年"
],
[
"銭形ガメ吉",
"海外部",
"メキシコ支部",
"11年"
]
]
-s/--slurp
-s
\n
-s
&
$ jq -sR '
[ split("\n")[] | select(length > 0) | split("&") ]
' testdata.asv
#...出力結果は先ほどと同じ
複雑なセパレーターの設定
split(パターン; フラグ)
$ echo 'a, b,c,d, e, +f$g/h i jkl mn+o p' | jq -R '
split("\\s|,|\\+|\\$|/";"g") | map( . | select(length > 0) )
'
#👇出力
[
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"jkl",
"mn",
"o",
"p"
]
|
$ echo 'a, b,c,d, e, +f$g/h i jkl mn+o p' | jq -R '
split("[\\s,+$/]";"g") | map( . | select(length > 0) )
'
#...出力は先程と同様
split(文字列)
$ echo 'a, b,c,d, e, +f$g/h i jkl mn+o p' | jq -R '
split(" ") |
map( split(",") | .[] ) |
map( split("+") | .[] ) |
map( split("$") | .[] ) |
map( split("/") | .[] )
'
#👇複数のセパレーターで配列化
[
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"jkl",
"mn",
"o",
"p"
]
map( split(",") | .[] )
まとめ
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー