現在、次の履歴を含むファイルがあります。
D20211011,S0519,306668,1
D20211004,S1600,306668,1
D20211009,S1604,306668,1
D20211010,S1605,306668,1
D20211006,S1610,306668,1
D20211011,S1611,306668,1
現在の日付があると仮定すると、20211011
日付が現在の日付より小さい行にのみ変換を適用し、過去の日付を持つ行を現在の日付に更新する必要があります。
上記の共有例では、2行から5行に変換する必要があります。
D20211004,S1600,306668,1 -> D20211011,S1600,306668,1
D20211009,S1604,306668,1 -> D20211011,S1604,306668,1
D20211010,S1605,306668,1 -> D20211011,S1605,306668,1
D20211006,S1610,306668,1 -> D20211011,S1610,306668,1
ベストアンサー1
あなたの場合、日付がISOスタイルで提供されるという利点があります。つまり、日付を整数値として解釈し、算術演算子(および)を使用して簡単に比較できますが、<
正しい順序を生成できます=
。>
したがって、次のawk
プログラムを使用できます。
awk -v cur="20211011" 'BEGIN{FS=OFS=","} {ldate=substr($1,2); if (ldate<cur) $1="D" cur} 1' input.csv
現在の日付はawk
変数として定義されますcur
。最初は、入力と出力のフィールド区切り文字がに設定されます,
。各行について、行の日付は、その行のフィールド 1 から最初の文字を削除することによって決定されます。結果 "整数" が小さい場合、cur
と の内容を連結してフィールドを上書きします。ルールブロックの外側にある「散らばった」コンテンツのように見えることは、可能な修正を含む現在の行を印刷するように指示します。D
cur
1
awk