Text-Processing
用於輸入和輸出 CSV 文件的 Bash 腳本/awk
我在創建 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()
。您可以根據需要使用它來獲得以秒、分鐘、小時為單位的時差。高溫高壓