1つのファイルにマージし、関連する欠落データを埋めるための2つのファイルセットがあります。
ファイルが,
分離されています。
最初のファイルには13個の列が含まれ、8番目の列には形式の日付が含まれていますYYYY-MM-DD
(注:ファイルには44日がありません)。 2番目のファイルには2つの列があり、最初のファイルはフルカレンダー年(366日)形式です。うるう年)YYYY-MM-DD
、2番目は関連するユリウス暦の日付値です。
不足している日付を含むサンプルファイル#1
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-26,Parts-per-million,24,100.0,0.379167,10
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-27,Parts-per-million,24,100.0,0.2875,10
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-28,Parts-per-million,11,46.0,0.163636,10
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-30,Parts-per-million,20,83.0,0.23,10
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-31,Parts-per-million,24,100.0,0.195833,10
不足している日付が記入され、ユリウス暦の日付が追加されたので、次のコマンドを使用してファイルをマージし、14列の新しいファイルを作成してみました。また、初期ファイルで1~7列と9列を固定値で自動入力し、-999
このデータがないと10~13列を自動的に埋めるコードも探しています。
awk -F ',' 'NR==FNR {h[$1] = $14; next} {print $1,$2,$3,$4,$5,$6,$7,$8,h[$2],$9,$10,$11,$12,$13}' temp2.tmp temp1.tmp > temp3.tmp
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-26,26,Parts-per-million,24,100.0,0.379167,10
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-27,27,Parts-per-million,24,100.0,0.2875,10
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-28,28,Parts-per-million,11,46.0,0.163636,10
**06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-29,29,Parts-per-million,-999,-999,-999,-999**
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-30,30,Parts-per-million,20,83.0,0.23,10
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-31,31,Parts-per-million,24,100.0,0.195833,10
答え1
今、日付/時刻の計算は常に...難しいことでした。特に。日付時系列が真夜中、月末、年末、または夏時間に切り替えられる場合。ここでは安全のためにエポック秒を使用します。このコマンドを使用して日付/時刻に再変換すると、date
すべての* nixバージョンで機能しない可能性があります。また、TZ
DSTの問題を回避するために変数を「UTC」に設定しました。なしで試してみるとわかります。一度試してみてください。
export TZ=UTC # get rid of side effects, e.g. DST switching
cut -d, -f8 samplefile | date -f- +%s | paste - samplefile > TMP1 # prepend epoch seconds to the input file
{ read MIN DUMMY # get file´s MIN and MAX dates
while read TMP DUMMY
do MAX=$TMP
done # and calculate a sequence of days between them
eval echo @{$MIN..$MAX..86400} | tr ' ' $'\n' | date -f- +$'%s\t%Y-%m-%d\t%y%j'
} < TMP1 > TMP2 # in epoch, yyyy-mm-dd, and julian format
join -a1 -a2 -- TMP1 TMP2 | awk -F"[, ]" ' # join first and second intermediate files
NF == 3 {split($0, TMPINS) # orig. files line missing; fill temp array with epoch etc. data
$0 = SAVED # get last saved complete line
$9 = TMPINS[2] # overwrite "yesterday´s" date
$NF = TMPINS[3] # append julian date
$11 = $12 = $13 = $14 = -999 # set invalid indicator
}
NF >= 13 {SAVED = $0 # correct line? save it
$1 = $1 # recreate line with OFS char
}
{sub($1",",_) # for all lines: remove leading epoch field
$14 = $15 # put julian date into right place
NF-- # get rid of last field; may not work in ALL awks
}
1 # default action: print
' OFS=","
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-26,Parts-per-million,24,100.0,0.379167,10,20026
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-27,Parts-per-million,24,100.0,0.2875,10,20027
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-28,Parts-per-million,11,46.0,0.163636,10,20028
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-29,Parts-per-million,-999,-999,-999,-999,20029
06,037,0016,42101,34.14435,-117.85036,1-HOUR,2020-01-30,Parts-per-million,20,83.0,0.23,10,20030
FIFOの助けを借りて、長いコマンドパイプラインにすべてを書くことができます。
mkfifo TMPFIFO
cut -d, -f8 samplefile | date -f- +%s | tee -a >(read MIN; while read TMP; do MAX=$TMP; done; eval echo @{$MIN..$MAX..86400} | tr ' ' $'\n' > TMPFIFO) | paste - samplefile | join -a1 -a2 -- - <(date -fTMPFIFO +$'%s\t%Y-%m-%d\t%y%j') | awk -F"[, ]" 'NF == 3 {split($0, TMPINS); $0 = SAVED; $9 = TMPINS[2]; $NF = TMPINS[3]; $11 = $12 = $13 = $14 = -999} NF >= 13 {SAVED = $0; $1 = $1} {sub($1",",_); $14 = $15; NF--} 1' OFS=","