awkまたはsed形式の可変期間

awkまたはsed形式の可変期間

awkとsedコマンドをたくさん試しましたが、ファイル形式を正しく指定できませんでした。主な問題は、時には存在し、時には存在しない列の途中で追加のコンマを処理することです。

csvファイルでは、次のようになります。

Num,Type,StartTime,Duration,Var1,Var2,Var3
1,Forward,9/11/2019 11:15,"15 h, 45 m",98.03,-1.38,-0.2
2,Forward,9/12/2019 13:00,"8 h, 21 m",97.84,-0.83,1.27
3,Forward,9/12/2019 21:30,"20 h, 30 m",99.06,-2.12,-1.64
4,Forward,9/14/2019 8:00,18 h,97.47,-0.84,0.07
5,Backward,9/30/2019 14:00,56 m,95.93,-0.17,1.26

次のように表示する必要があります。

Num,Type,StartTime,Duration,Var1,Var2,Var3
1,Forward,9/11/2019 11:15,15:45,98.03,-1.38,-0.2
2,Forward,9/12/2019 13:00,8:21,97.84,-0.83,1.27
3,Forward,9/12/2019 21:30,20:30,99.06,-2.12,-1.64
4,Forward,9/14/2019 8:00,18:00,97.47,-0.84,0.07
5,Backward,9/30/2019 14:00,0:56,95.93,-0.17,1.26

ベストアンサー1

確認する方法は次のとおりです。ただawkスクリプトを使用して必須フィールドを変更する

BEGIN { FPAT = "([^,]+)|(\"[^\"]+\")"; OFS = "," }

function convert_time(timestr)
{
  gsub(/[" ]/, "", timestr);
  if (timestr !~ ",") {
    number = substr(timestr, 1, length(timestr) -1)
    if (timestr ~ "m$") return "0:" number
    if (timestr ~ "h$") return number ":00"
  } else {
    gsub(/[^0-9,]/,"", timestr)
    gsub(/,/,":", timestr)
    return timestr
  }
}

NR > 1 { $4 = convert_time($4) }

{ print $0 }

  • 使用してFPAT一部のフィールドにコンマが含まれていても、awkで変数を分割できます。二重引用符の中に含まれている必要があります。
  • 私はそれを使用していますオルフェウス変更された行を印刷するときにフィールドをカンマで区切るには、変数を使用します。
  • 各行(ヘッダーであると仮定する最初の行を除く)は、convert_time要求に応じて4番目のフィールドを変換するために作成した関数を使用します。
  • 最後に変更された行を印刷します。

機能convert_time:まず、フィールドに日付も含まれている場合は分と時間しかないと仮定しました。たとえば、関数が正しく機能しないため、それに応じて変更する必要があります。

  • 私はgsub変数からスペースや引用符を削除するために使用しますtimestr
  • カンマが含まれていない場合は、分timestrまたは時間という項目が 1 つしかないことを意味します。
    • 最後の文字を削除する関数を使用して数字のみを取得しますsubstr
    • 変数の最後の文字timestrがm(分)の場合、00:numberが返されます。
    • 変数の最後の文字timestrがh(時間)の場合、数値:00が返されます。
  • カンマが含まれている場合、timestr最初の数字は時、2番目の数字は分であると想定されます。
    • 私はgsub、数字やカンマ以外のすべての文字を削除するために使用します。これによりh文字とm文字が削除され、数字とカンマのみが残ります。
    • その後、再びgsub

スクリプト全体をというファイルに入れてconvert_time.awk実行しました。

出力:

$ cat file.csv | awk -f convert_time.awk
Num,Type,StartTime,Duration,Var1,Var2,Var3
1,Forward,9/11/2019 11:15,15:45,98.03,-1.38,-0.2
2,Forward,9/12/2019 13:00,8:21,97.84,-0.83,1.27
3,Forward,9/12/2019 21:30,20:30,99.06,-2.12,-1.64
4,Forward,9/14/2019 8:00,18:00,97.47,-0.84,0.07
5,Backward,9/30/2019 14:00,0:56,95.93,-0.17,1.26

この場合、特定のフィールド(4番目のフィールド)のみが変更されます。

おすすめ記事