Text-Processing
通過 bash 腳本在 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
假設目前日期是
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
嘗試
awk
:awk -v today=$(date +%Y%m%d) ' BEGIN{FS=OFS=","} substr($1,2)<today{$1="D"today;} 1' file
-v today=$(date +%Y%m%d)
使用目前日期設置變數。BEGIN{FS=OFS=","}
設置輸入 (FS
) 和輸出 (OFS
) 欄位分隔符。substr($1,2)<today
從第一個欄位中截取D
並將其與目前日期進行比較。$1="D"today;
用目前日期替換第一個欄位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
列印目前行,包括任何可能的修改。