までのtable.txt
時系列を含むプレーンテキストテーブル()がいくつかあります。残念ながら、そのうちのいくつかは、次のように時系列の最後の日が欠落しています。2005
2099
31.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つの記号が続く新しい行をすべてのファイルに追加します。30
RES
2099 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)