LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

ShellScript 【 for 】

書式

for 【変数名】 in 【値】
do
  【実行されるコマンド等】
done

# for ~ do を1行に書く場合は do の前に ; が必要
for 【変数名】 in 【値】; do
  【実行されるコマンド等】
done
カレントディレクトリ内のすべてのファイルに対して一定の処理を行なう場合 【値】 を * にする
# ex. カレントディレクトリ内のフォルダおよびファイル名一覧を取得
for file in *; do
  echo "${file}"
done
ワイルドカードや正規表現などのパターンの指定も可能
# ex. test1.csv から test100.csv のファイルの内容を test1-100.csv へ出力
for file in test{1..100}.csv; do
  cat "${file}" >> test1-100.csv
done

>> の詳細は コマンドの標準出力をファイルに追加出力 を参照。

算術式の for 文(書式)

for ((【算術式1】; 【算術式2】; 【算術式3】)) do
  【実行されるコマンド等】
done

最初に【算術式1】を、次に【算術式2】を評価し【算術式2】が true である限り do ~ done を実行。
done の時点で【算術式3】を評価。

# ex. test.csv を test1.csv から test100.csv というファイル名で100コ複製
for ((i=1; i<=100; i++)) do
  cp test.csv test"${i}".csv
done

awkコマンドで csv の目的の列のみ取り出したいが、引数である位置パラメータをカラム名で特定したい場合に、算術式の for 文を活用。

# csv のヘッダを取得
csv_header=`head -n 1 test.csv`

# csv の列数を取得
cols=`echo "${csv_header}" | awk -F ',' '{print NF}'`

# 取得した列数分、順番に目的列のカラム名との一致をテストする
for ((i=1; i<=${cols}; i++)) do
  col_name=`echo "${csv_header}" | cut -d "," -f ${i}`
  if [ ${col_name} = '【目的列のカラム名】' ]; then
    target_arg='$'${i}  # 目的の列の位置パラメータを target_arg へ代入
    break  # target_arg を取得できたら for 文のループを終了
  fi
done

# test.csv のカラム名で特定した目的の列を取得
awk -F ',' '{print '${target_arg}'}' test.csv

各コマンドの詳細
 - head
 - cut
 - test
 - if 文

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2