テーブルに行を追加する

テーブルに行を追加する

までのtable.txt時系列を含むプレーンテキストテーブル()がいくつかあります。残念ながら、そのうちのいくつかは、次のように時系列の最後の日が欠落しています。2005209931.12.2099

YEAR MONTH DAY RES
2005 1     1   1000
2005 1     2   1001
[...]
2099 12    29  1002
2099 12    30  1003

前日の値()を貼り付けて時31.12.2099系列()に欠落している日付を追加するには?RES提供された最小例を考慮すると、出力は次のようになります。

YEAR MONTH DAY RES
2005 1     1   1000
2005 1     2   1001
[...]
2099 12    29  1002
2099 12    30  1003
2099 12    31  1003

答え1

そしてawk

awk '{a=$0}1; END{$0=a; if($1==2099&&$2==12&&$3==30){$3=31;print}}' file | column -t
  • r=$0変数をa完全な行に設定します。
  • 1すべての行の実際の条件を印刷します。
  • END{...}すべての行が処理されたら、このブロックを実行します。
    • $1==2099&&$2==12&&$3==30最後の行が2099年12月30日の場合(13行目がありません)
    • $3=31日付を次に設定してください。31
    • print追加の行を印刷します。
  • column -tリストを整理することです。

入力ファイルの結果:

YEAR  MONTH  DAY  RES
2005  1      1    1000
2005  1      2    1001
...
2099  12     29   1002
2099  12     30   1003
2099  12     31   1003

答え2

tableこのスクリプトは、最後の行の後に2つのスペースと4つの記号が続く新しい行をすべてのファイルに追加します。30RES2099 12 31 RES(from line before)

sed -i '$ s/30\(  ....\)$/&\n2099 12    31\1/' table*

答え3

ファイル名がすべて始まると仮定するとtable(そうでない場合は、globパターンをすべてのファイル名と一致するものに変更するだけです)、次のことができます。

for file in table*; do
    awk -vi="2099 12    31" '1;END{if($0!=i){print i,$NF}}' "$file" > "$file".new
done

このawkコマンドは、変数をi欠落行として定義します。1;各行を印刷してファイル全体を読み取り、END{}ブロックを実行します。END{}ブロック内で$0読み込まれる最後の行、つまりファイルの最後の行になります。値と等しくない場合は、ファイルの最後の行の最後のフィールドをi印刷します。i(NF)

関連情報