次のCSVファイルがあります。
first_name,surname,email,
first_name2,surname2,email2,
....3,..
....4,...
各列には同じ数の行があります。
各列を繰り返し、各列から値を取得してコマンドに置き換えるコマンドを実行したいと思います。
例えば、
for each_row;
do [command foo{first_name} .... bar{surname}.... sth_else{email}];
done
私は次のことをするつもりです
for i in `awk -F, '{print $1}' my_file.csv`; do
some command with i`;
done
ただし、これにより、フィールド1の値でのみコマンドを実行できます。各反復で各列の値を取得できるようにコマンドを実行するにはどうすればよいですか?
ベストアンサー1
CSVが「簡単なCSV」形式であり、フィールドにカンマや改行が含まれていないと仮定すると(通常のCSVファイルではカンマまたは改行が許可され、フィールドは正しく引用されます)、次のようにフィールドを直接読み取ることができますread
。
while IFS=, read -r name familyname address; do
printf 'Got "%s", "%s", and "%s"\n' "$name" "$familyname" "$address"
done <file.csv
ユーティリティread
は各行を値のあるフィールドに分割し、$IFS
呼び出し時に変数にコンマが含まれていることを確認しますread
。カンマで区切られた最初の2つのフィールドは変数でname
終わります。familyname
残りの行最後に変数に表示されますaddress
。各行が不要なコンマで終わる場合(質問のように)、各行からダミー変数を読み取るか(最後に別の変数としてdummy
追加)、ループ内のwith値を調整して末尾のコンマを切り捨てます。address
read
address
address=${address%,}
データのバックスラッシュを正しく読み取るには、-r
withを使用します。read
CSVファイルにスキップする必要があるヘッダー行がある場合
sed 1d file.csv |
while IFS=, read -r name familyname address; do
printf 'Got "%s", "%s", and "%s"\n' "$name" "$familyname" "$address"
done
同じ操作を実行する代替sed
コマンド(入力の最初の行を削除して他のすべての行を渡す)を使用できます。tail -n +2