通过 bash 脚本更改 CSV 文件中的日期

Aay*_*ain 0 text-processing date csv

目前我有一个包含如下记录的文件:

D20211011,S0519,306668,1
D20211004,S1600,306668,1
D20211009,S1604,306668,1
D20211010,S1605,306668,1
D20211006,S1610,306668,1
D20211011,S1611,306668,1
Run Code Online (Sandbox Code Playgroud)

假设当前日期是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
Run Code Online (Sandbox Code Playgroud)

Adm*_*Bee 5

在您的情况下,您的优势是日期以 ISO 样式给出,这意味着它们可以被解释为整数值,并使用算术运算符( 和 )进行简单比较,<同时=仍然>产生正确的顺序。

因此,您可以使用以下awk程序:

awk -v cur="20211011" 'BEGIN{FS=OFS=","} {ldate=substr($1,2); if (ldate<cur) $1="D" cur} 1' input.csv
Run Code Online (Sandbox Code Playgroud)

当前日期定义为awk变量cur。一开始,输入和输出的字段分隔符设置为,。然后,对于每一行,行日期是通过从该行的字段 1 中删除第一个字符来确定的。如果生成的“整数”小于,则该字段将被和 的内容的cur串联覆盖。规则块之外看似“杂散”的内容指示打印当前行,包括任何可能的修改。Dcur1awk