Text-Processing

用於輸入和輸出 CSV 文件的 Bash 腳本/awk

  • May 17, 2022

我在創建 bash/awk/sed 腳本時遇到了一些麻煩,該腳本將採用逗號分隔的三列 CSV 文件(名字、姓氏、出生日期),並輸出另一個 CSV 文件,該文件與輸入具有相同的列顯示目前日期和出生日期之間的差異的附加列,以年為單位。

$ yourscript <input CSV file> <output CSV file>
  • input.csv可能看起來像這樣:
bob,wag,06/13/1958
ashley,hay,01/23/1983
evan,bert,09/11/1972
  • output.csv應該是這樣的:
bob,wag,06/13/1958,62
ashley,hay,01/23/1983,37
evan,bert,09/11/1972,48
$ cat data
bob,wag,06/13/1958
ashley,hay,01/23/1983
evan,bert,09/11/1972

要在一個名為的文件output-file中輸出並同時顯示到 STDOUT:

$ awk -v year="$(\date +%Y)" 'BEGIN{FS="/"} {print $0 "," year-$3}' data | tee output-file
bob,wag,06/13/1958,62
ashley,hay,01/23/1983,37
evan,bert,09/11/1972,48

或者只是輸出到同一個文件:

$ awk -v year="$(\date +%Y)" 'BEGIN{FS="/"} {print $0 "," year-$3}' data > output-file

要執行更準確的時間計算,您可以使用gawk時間和字元串函式(根據 @AdminBee 的建議)。使用輸入數據:

$ cat data
bob,wag,06/13/1958
ashley,hay,01/23/1983
evan,bert,09/11/1972

您可以獲得從現在到每行顯示的日期之間的天數時差,其中:

$ awk -F, 'BEGIN{today=systime()} 
          {print $0 "," int((today-mktime(substr($3,7,4)" "substr($3,1,2)" "substr($3,4,2)" "00" "00" "00))/(3600*24))}' \
          data | tee output-file

bob,wag,06/13/1958,22755
ashley,hay,01/23/1983,13765
evan,bert,09/11/1972,17551

片段:

int((today-mktime(substr($3,7,4)" "substr($3,1,2)" "substr($3,4,2)" "00" "00" "00))/(3600*24))

為輸入文件的每一行做三件基本的事情:

  • 它計算自 1970-01-01 00:00:00 UTC(在 POSIX 系統上)以來經過的時間(以秒為單位),不計算閏秒,mktime(substr($3,7,4)" "substr($3,1,2)" "substr($3,4,2)" "00" "00" "00)
  • 它計算上述數量和變數 之間的時間差,該變數today包含自 1970-01-01 00:00:00 UTC 以來執行時經過的秒數。
  • 它將以秒為單位的時間差除以 3600*24 以得到相同的天數,並且只考慮結果的整數部分,以得到整天int()

您可以根據需要使用它來獲得以秒、分鐘、小時為單位的時差。高溫高壓

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