我想合并三个具有空格分隔列的文件中的数据。
第一个文件:
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
我想实现以下过程来创建所需的输出文件。重复(对于第一个文件中的每个循环):
- 从第一个文件中读取循环编号。
grep
(搜索)第二个文件中的循环编号并提取/捕获该行。 (在我尝试解决这个问题时,如下所示,我将该行保存在名为 的临时/中间文件中output_1
。)- 从该行中提取 mux_select 值。
grep
对于第三个文件中的 mux_select 值并提取/捕获该行。 (在尝试解决此问题时,我将该行保存在名为 的临时/中间文件中output_2
。)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