我有一個包含以下內容的檔案...
false|aaa|user|aaa001|2014-12-11|
false|bbb|user|bbb||
false|ccc|user|ccc|2021-10-19|
false|ddd|user|ddd|2018-11-16|
false|eee|user|eee|2020-06-02|
我想使用第 5 列中的日期來計算距當前日期的天數并將其附加到檔案中的每一行。
最終結果將是一個如下所示的檔案,假設當前日期是 2022 年 1 月 13 日...
false|aaa|user|aaa001|2014-12-11|2590
false|bbb|user|bbb||
false|ccc|user|ccc|2021-10-19|86
false|ddd|user|ddd|2018-11-16|1154
false|eee|user|eee|2020-06-02|590
檔案中的某些行將不包含日期值(這是預期的)。我需要 Linux 上的 Bash 腳本的解決方案。
我可以使用 echo 為單行提交命令,然后通過在第 5 個欄位上使用 cut 計算從當前日期開始的天數(見下文)...
echo "false|aaa|user|aaa001|2014-12-11" | echo $(( ($(date --date=date "%Y-%m-%d" %s) - $(date --date=cut -d'|' -f5 %s) )/(60*60*24) ))
2590
我不知道如何一次執行這一行,捕獲“天數”值,然后將其附加到檔案中的每一行。
uj5u.com熱心網友回復:
這是一種使用方法
paste附加輸出sed安排空行和awk計算所需的天數。
這適用于GNU date。BSD date必須使用類似date -jf x %s.
編輯:更新日期以與當天進行比較。
% current=$(date %m/%d/%Y)
% paste -d"\0" file <(cut -d"|" -f5 file |
sed 's/^$/#/' |
xargs -Ix date -d x %s 2>&1 |
awk -v cur="$(date -d "$current" %s)" '/invalid/{print 0; next}
{print int((cur-$1)/3600/24)}')
false|aaa|user|aaa001|2014-12-11|2590
false|bbb|user|bbb||0
false|ccc|user|ccc|2021-10-19|86
false|ddd|user|ddd|2018-11-16|1154
false|eee|user|eee|2020-06-02|590
也以空箱date回傳date: invalid date ‘#’。如果任何其他實作的行為不同,則必須相應地調整 awk 正則運算式。
資料
% cat file
false|aaa|user|aaa001|2014-12-11|
false|bbb|user|bbb||
false|ccc|user|ccc|2021-10-19|
false|ddd|user|ddd|2018-11-16|
false|eee|user|eee|2020-06-02|
uj5u.com熱心網友回復:
Miller提供了一些有趣的工具(以及大多數作業系統的可執行檔案):
mlr --csv -N --fs '|' put '
begin { @today = systime() }
is_not_null($5) { $6 = (@today - localtime2sec($5." 00:00:00")) // 86400 }
' file.txt
輸出:
false|aaa|user|aaa001|2014-12-11|2591
false|bbb|user|bbb||
false|ccc|user|ccc|2021-10-19|87
false|ddd|user|ddd|2018-11-16|1155
false|eee|user|eee|2020-06-02|591
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/410992.html
標籤:
