カンマ区切りのファイルを繰り返すには?
私は以下を試しました:
$ cat file | tr ',' '\n' > /tmp/f1
$ while read -r line;do
echo $line;
done < /tmp/f1
一時ファイルを作成せずにコンテンツの最初の行を繰り返すにはどうすればよいですか?
どんなアイデアがありますか?
答え1
まず、テキスト解析にシェルループを使用しないでください。。これは実行が難しく、エラーが発生しやすく、読み取りも困難です。そして非常に遅いです。とても遅いです。代わりに、awk
「フィールド」で読むことができるように特別に設計されたものを使用してください。たとえば、次の入力ファイルを使用します。
foo, bar, baz
oof, rab, zab
awk -F,
フィールド区切り記号を次のように設定して、カンマ区切りの各フィールドを読み取ることができます,
。
$ awk -F, '{ print "The 1st field is",$1,"the 2nd", $2,"and the 3rd", $3}' file
The 1st field is foo the 2nd bar and the 3rd baz
The 1st field is oof the 2nd rab and the 3rd zab
シェルでこれに固執しても、一時ファイルは必要ありませんtr
。while read
カンマで区切ることができます。
$ while IFS=, read -r one two three; do
echo "The 1st field is $one, the 2nd $two and the 3rd $three";
done < file
The 1st field is foo, the 2nd bar and the 3rd baz
The 1st field is oof, the 2nd rab and the 3rd zab
答え2
csvファイルのフィールドは複数行にまたがることができます。これがまさに私が使うことを好む理由です。xsvcsvを解析する必要があるとき。
bashとxsvを使用してcsvファイルを解析する1つの方法は次のとおりです。
csvFile="myfile.csv"
lengthItems=$((($(xsv count "$csvFile") - 1 ))) # -1 because for loop start at 0
for i in $( seq 0 "$lengthItems" ); do
row="$(xsv slice -i "$i" "$csvFile")" # real magic happening here
# Do what you want with your $row here
done