シェルスクリプトで文字列のフィールド分割

ある入力データの文字列をフィールドごとに分割する方法です。

IFSを使用する方法

$ vi field_split_IFS.bash
#!/bin/bash
I_DATA="apple,banana,orange"
IFS=',' read -r -a ARRAY <<< "${I_DATA}"
i=0
while [[ $i -lt ${#ARRAY[@]} ]]; do
  echo "FIELD$((i+1)) = ${ARRAY[$i]}"
  ((i++))
done
$ chmod +x field_split_IFS.bash
$ ./field_split_IFS.sh
FIELD1 = apple
FIELD2 = banana
FIELD3 = orange

cutコマンドを使用する方法

$ vi field_split_cut.sh
#!/bin/bash
I_DATA="apple,banana,orange"
FIELD_COUNT=$(echo "${I_DATA}" | awk -F',' '{print NF}')
i=1
while [[ ${i} -le ${FIELD_COUNT} ]]; do
  FIELD=$(echo "${I_DATA}" | cut -d',' -f"${i}")
  ARRAY+=("${FIELD}")
  ((i++))
done
j=0
while [[ ${j} -lt ${#ARRAY[@]} ]]; do
  echo "FIELD$((j+1)) = ${ARRAY[$j]}"
  ((j++))
done
$ chmod +x field_split_cut.sh
$ ./field_split_cut.sh
FIELD1 = apple
FIELD2 = banana
FIELD3 = orange

awkコマンドを使用する方法

$ vi field_split_awk.sh
#!/bin/bash
I_DATA="apple,banana,orange"
echo "${I_DATA}" | awk -F',' '{
  for (i = 1; i <= NF; i++) {
    printf("FIELD%d=%s\n", i, $i)
  }
}'
$ chmod +x field_split_awk.sh
$ ./field_split_awk.sh
FIELD1 = apple
FIELD2 = banana
FIELD3 = orange

sedコマンドを使用する方法

$ vi field_split_sed.sh
#!/bin/bash
I_DATA="apple,banana,orange"
i=1
echo "${I_DATA}" | sed 's/,/\'$'\n/g' | while read -r LINE; do
  echo "FIELD${i}=${LINE}"
  ((i++))
done
$ chmod +x field_split_sed.sh
$ ./filed_split_sed.sh
FIELD1 = apple
FIELD2 = banana
FIELD3 = orange

タイトルとURLをコピーしました