列の繰り返し

列の繰り返し

次の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値を調整して末尾のコンマを切り捨てます。addressreadaddressaddress=${address%,}

データのバックスラッシュを正しく読み取るには、-rwithを使用します。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

おすすめ記事