カンマで区切られた3つの列(名前、姓、生年月日)で構成されるCSVファイルを取得し、同じ入力で別のCSVファイルを出力するbash / awk / sedスクリプトを作成するのに問題があります。追加の列には次のものが表示されます。現在の日付と生年月日の年の差。
$ 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
答え1
$ 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
答え2
gawk
より正確な時間計算を実行するには、「s」を使用できます。時間と文字列関数(@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))
入力ファイルの各行に対して 3 つの基本操作が実行されます。
- うるう秒は計算せず、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()
。
これを使用して、要件に応じて秒、分、時間単位の視差を取得できます。ファタイ
答え3
日付の違いを取得するには、この小さなbash機能を使用できます。
あなたのニーズに合わせて次の番号を使用してください
- #取得空価格差:86400
- #取得年度違い: 31536000
バッシュ機能
datediff() {
current_date=$(date -d "$1" +%s)
birth_date=$(date -d "$2" +%s)
echo $(( (current_date - birth_date) / 31536000)) Years
}
使用法:
datediff '9/28/2020' '1/1/1999'
出力:
21 years
答え4
あなたが本当に欲しいものが何であるかによって異なります。
年の違い:
(echo "firstname,lastname,d"; cat input.csv) | csv-sqlite \
"select *, strftime('%Y', 'now') - substr(d, 7, 4) as year_diff
from input" | csv-header --remove
年齢:
(echo "firstname,lastname,d"; cat input.csv) | csv-sqlite
"select *, strftime('%Y', 'now') - substr(d, 7, 4) -
case when strftime('%m%d', 'now') >= (substr(d, 1, 2) || substr(d, 4, 2))
then 0 else 1 end as age
from input" | csv-header --remove
csv-sqliteとcsv-headerは以下から来ました。csv-nix-ツール