各レコードが特定の値を持つようにCSVファイルを処理するためにgitbashで実行されるスクリプトを設定しようとしました。最後のフィールドは、Bean()から""
1から16まで繰り返される値に変更されました。また、更新された値の前にはいくつかのテキストがあります。
CSVファイル内の一致する各レコードに対して、フィールドはと等しくなければならず、で終わって再起動する必要がありREP0001
ますREP0100
。REP0001
以下は、テキストを入力する例です。
"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行目の例では、最後のフィールドをから開始に変更して値まで繰り返し、から""
開始しようとします。REP0001
REP0100
REP0001
以下は必須テキストの例です。
"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
その行から始めるように求められます。
答え2
別の(よりコンパクトな)バージョンsprintf
:
awk 'BEGIN{FS=OFS=","} $4 ~ /"RENT OUT"/ {$12=sprintf("\"REP%04i\"",++i);i=i%100}1'