BashでCSVファイルを繰り返すには?

BashでCSVファイルを繰り返すには?

カンマ区切りのファイルを繰り返すには?

私は以下を試しました:

$ 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

シェルでこれに固執しても、一時ファイルは必要ありませんtrwhile 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

関連情報