あるファイルを読み、別のファイルから一致するデータを抽出し、3番目のファイルからそのコンテンツを取得する方法

あるファイルを読み、別のファイルから一致するデータを抽出し、3番目のファイルからそのコンテンツを取得する方法

スペースで区切られた列を持つ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

必要な出力ファイルを生成するために、次のプロセスを実装したいと思います。繰り返し(最初のファイルの各ループについて):

  1. 最初のファイルからループ番号を読み込みます。
  2. grep(検索)2番目のファイルからループ番号を検索し、その行を抽出/キャプチャします。 (この問題を解決しようとして、次のようにその行をという一時/中間ファイルに保存しましたoutput_1。)
  3. この行から mux_select 値を抽出します。
  4. grep3番目のファイルのmux_select値に対してその行を抽出/キャプチャします。 (この問題を解決しようとしたときに、その行をという一時/中間ファイルに保存しましたoutput_2。)
  5. 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

おすすめ記事