如何读取一个文件,从另一个文件中提取匹配的数据,并在第三个文件中 grep 该内容

如何读取一个文件,从另一个文件中提取匹配的数据,并在第三个文件中 grep 该内容

我想合并三个具有空格分隔列的文件中的数据。

第一个文件:

CYCLE_NUMBER    output
---------------------
32                1
28                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

第三个文件:

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(搜索)第二个文件中的循环编号并提取/捕获该行。 (在我尝试解决这个问题时,如下所示,我将该行保存在名为 的临时/中间文件中output_1。)
  3. 从该行中提取 mux_select 值。
  4. grep对于第三个文件中的 mux_select 值并提取/捕获该行。 (在尝试解决此问题时,我将该行保存在名为 的临时/中间文件中output_2。)
  5. paste这两行,写入最终的输出文件。

我通过编写这个脚本尝试了这一点:

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

相关内容