Bashスクリプト/awk入出力CSVファイル

Bashスクリプト/awk入出力CSVファイル

カンマで区切られた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-ツール

関連情報