スペースで区切られた列を持つ3つのファイルのデータをマージしたいと思います。
最初のファイル:
CYCLE_NUMBER output
---------------------
32 1
28 2
2番目のファイル:
DATALOG_OUTPUT Time CELL_TYPE MUX_SELECT CYCLE_NUMBER
-
DATALOG_OUTPUT 9500 0 0 32
DATALOG_OUTPUT 19500 1 4 12
DATALOG_OUTPUT 29500 2 8 28
3番目のファイル:
MUX_SEL CUTNO
-
8 combo_1
0 combo_2
12 combo_3
私が望む出力は
DATALOG_OUTPUT Time CELL_TYPE MUX_SELECT CYCLE_NUMBER CUTNO
-
DATALOG_OUTPUT 9500 0 0 32 combo_2
DATALOG_OUTPUT 29500 2 8 28 combo_1
必要な出力ファイルを生成するために、次のプロセスを実装したいと思います。繰り返し(最初のファイルの各ループについて):
- 最初のファイルからループ番号を読み込みます。
grep
(検索)2番目のファイルからループ番号を検索し、その行を抽出/キャプチャします。 (この問題を解決しようとして、次のようにその行をという一時/中間ファイルに保存しましたoutput_1
。)- この行から mux_select 値を抽出します。
grep
3番目のファイルのmux_select値に対してその行を抽出/キャプチャします。 (この問題を解決しようとしたときに、その行をという一時/中間ファイルに保存しましたoutput_2
。)paste
これらの2行は最終出力ファイルに書き込まれます。
私は次のスクリプトを書いてこれを試しました。
foreach cycle (`cat first_file | awk '{print $1}'`)
set cycle_number = ` cat second_file | grep -w $cycle`
echo $cycle_number >> output_1
foreach mux (`cat output_1 | awk '{print $3}'`)
set mux_select = ` cat third_file | grep -w $mux`
echo $mux_select >> output_2
paste output_1 output_2 >> output_file
end
end
答え1
解決策は次のとおりです。TxR:
コードは次の場所にありますjoin.txr
。
CYCLE_NUMBER output
---------------------
@(collect)
@cycno @(skip)
@ (next)
@ (skip)
DATALOG_OUTPUT @time @cellt @muxsel @cycno
@ (next)
@ (skip)
@muxsel @cutno
@(end)
@(output)
DATALOG_OUTPUT Time CELL_TYPE MUX_SELECT CYCLE_NUMBER CUTNO
-
@ (repeat)
DATALOG_OUTPUT @{time 11} @{cellt 11} @{muxsel 13} @{cycno 11}@cutno
@ (end)
@(end)
ランニング:
$txr Join.txr ファイル 1 ファイル 2 ファイル 3 DATALOG_OUTPUT 時間 CELL_TYPE MUX_SELECT CYCLE_NUMBER CUTNO - データ出力 9500 0 0 32 組み合わせ_2 DATALOG_OUTPUT 29500 2 8 28 組み合わせ_1
クエリ時間9500万:
$ txr -Dtime=9500 Join.txr ファイル 1 ファイル 2 ファイル 3 DATALOG_OUTPUT 時間 CELL_TYPE MUX_SELECT CYCLE_NUMBER CUTNO - データ出力 9500 0 0 32 組み合わせ_2
クエリサイクル番号28万:
$ txr -Dcycno=28 Join.txr ファイル 1 ファイル 2 ファイル 3 DATALOG_OUTPUT 時間 CELL_TYPE MUX_SELECT CYCLE_NUMBER CUTNO - DATALOG_OUTPUT 29500 2 8 28 組み合わせ_1