テーブルに列を追加する

テーブルに列を追加する

次のデータ列を含むいくつかのASCIIファイルがあります。

DATA
1564
1896
1238
1479
1562
1894
1489
....

日付を含む列を実装する必要があります。各データセットは1900-01-01(年-月-日)から始まることがわかります。したがって、各ファイルを次のように再フォーマットしたいと思います。

DATE DATA
1900-01-01 1564
1900-01-02 1896
1900-01-03 1238
1900-01-04 1479
1900-01-05 1562
1900-01-06 1894
1900-01-07 1489
.....

どうすればいいですか?

答え1

GNUにアクセスできる場合は、date次のことができます。

$ ( date="1899-12-31"; printf 'DATE\tDATA\n';  
    tail -n+2 file | 
        while read line; do 
            date="$(date -d "$date + 1 day" +%F)" 
            printf '%s\t%s\n' "$date" "$line"
        done; ) > newfile

説明する

  • date="1899-12-31":変数を$date開始日から1日を引いた日付に設定します。
  • printf 'DATE\tDATA\n';:列ヘッダを印刷します。
  • tail -n+2 file |:ファイルの最初の行(ヘッダー)を除くすべての項目を印刷してループに渡しますwhile
  • while read line; do ... ; done:各入力ラインを処理する$line
  • date="$(date -d "$date + 1 day" +%F)":値に1日を追加します$date
  • printf '%s\t%s\n' "$date" "$line":現在の値$date$line変数を印刷します。
  • ( ... ) > newfileprintf:これにより、コマンド全体がサブシェルで実行されるため、最初のコマンドとループの出力をキャプチャしますnewfile

答え2

#!/bin/bash

printf "DATE\tDATA\n"

offset=0

sed -n '2,$p' |
while read data; do
        thedate=$( gdate -d "1900-01-01 + $offset days" +"%F" )
        printf "%s\t%s\n" "$thedate" "$data"
        (( ++offset ))
done

この小さなスクリプトが使用されます

$ bash script.sh <data
DATE    DATA
1900-01-01  1564
1900-01-02  1896
1900-01-03  1238
1900-01-04  1479
1900-01-05  1562
1900-01-06  1894
1900-01-07  1489

ヘッダーを印刷し、入力ファイル(ヘッダー " DATA"を含む)の最初の入力行をスキップします。

これはGNUを使用dateして現在の行の日付を1900-01-01のオフセットとして計算します。gdatedate

次に、入力から読み取られたデータと共に計算された日付を、タブ区切りの2つの列に正しい形式で出力します。

関連情報