fieldBで指定された値を持つCSVファイルでfieldAを繰り返します。

fieldBで指定された値を持つCSVファイルでfieldAを繰り返します。

各レコードが特定の値を持つようにCSVファイルを処理するためにgitbashで実行されるスクリプトを設定しようとしました。最後のフィールドは、Bean()から""1から16まで繰り返される値に変更されました。また、更新された値の前にはいくつかのテキストがあります。

CSVファイル内の一致する各レコードに対して、フィールドはと等しくなければならず、で終わって再起動する必要がありREP0001ますREP0100REP0001

以下は、テキストを入力する例です。

"00:30:00","01:00:00","10/14/2014","RETURN","PASADENA","TX","12:30:00","sedan","","","corporate","CO01353"
"01:00:00","01:30:00","10/14/2014","RENT OUT","HOUSTON","TX","00:30:00","sedan","","","personal",""

例の最初の行は変更したくありませんが、それでも出力に含めます。 2行目の例では、最後のフィールドをから開始に変更して値まで繰り返し、から""開始しようとします。REP0001REP0100REP0001

以下は必須テキストの例です。


"01:00:00","01:30:00","10/14/2014","RENT OUT","HOUSTON","TX","00:30:00","sedan","","","personal","REP0001"

試しましたが、スクリプトの専門家sedではawkありません。必要な値を持つレコードを見つけて、必要な値を挿入する部分をクリーンアップするだけです。しかし、繰り返し魔法を実行する方法がわかりません。


awk 'BEGIN{FS=",";OFS=","} $4 ~ /"RENT OUT"/ {$12="\042""REP0001""\042"}1' Rentals.csv  > output

誰もが正しい方向に私を指すことができますか?ファイル自体の長さは約2000行です。

ベストアンサー1

私はこれがあなたが望むことをすると信じています:

$ awk 'BEGIN{FS=",";OFS=","} $4 ~ /"RENT OUT"/ {NF--;printf $0; x=x%100;x++; printf ",\"REP%04i\"\n",x;next} 1' rentals.csv 
"00:30:00","01:00:00","10/14/2014","RETURN","PASADENA","TX","12:30:00","sedan","","","corporate","CO01353"
"01:00:00","01:30:00","10/14/2014","RENT OUT","HOUSTON","TX","00:30:00","sedan","","","personal","REP0001"

変更された唯一の部分は次のコマンドです。

$4 ~ /"RENT OUT"/ {NF--;printf $0; x=x%100;x++; printf ",\"REP%04i\"\n",x;next}

一度に1つの新しい作品をインポートします。

  • NF--

    これにより、行から最後の(空白)フィールドが削除されます。

  • `プリント $0

    これで行が印刷されます(最後のフィールドは除く)。

  • x=x%100;x++

    カウンタモジュールxでは、100は1ずつ増加します。これにより、カウンタは1から100まで循環し、再び1に戻ります。

  • printf ",\"REP%04i\"\n",x

    これにより、カウンターを含む新しい最後のフィールドが印刷されます。

  • next

    この行をすでに印刷しているので、残りのawkコマンドをスキップしてnextその行から始めるように求められます。

おすすめ記事