Text-Processing

通過 bash 腳本在 CSV 文件中移動日期

  • October 14, 2021

目前我有一個包含這樣記錄的文件:

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和 的內容覆蓋cur1規則塊之外的看似“雜散”指示awk列印目前行,包括任何可能的修改。

引用自:https://unix.stackexchange.com/questions/672890