使用索引文件中的 awk/sed 重定位字符串

Relocation strings using awk/sed from a index file

我将永远感谢来自该网站的所有帮助。我想根据索引文件中的索引号重新定位字符串。

索引号显示在索引文件的第一列 (index.txt),我想根据索引号重新定位 "path"。如果索引号相同,路径将放在同一行中。例如,有两个零,所以 path_sparc_ifu_dec_in_3826 放在第一行,path_sparc_ifu_dec_in_4349 放在第一行和 path_sparc_ifu_dec_in_3826 旁边。

index.txt:

 0        path_sparc_ifu_dec_in_3826  str    DR     -         -
 0        path_sparc_ifu_dec_in_4349  stf    DR     -         -
 1        path_sparc_ifu_dec_in_2374  stf    DR     -         -
 1        path_sparc_ifu_dec_in_4011  stf    DR     -         -
 2        path_sparc_ifu_dec_in_3078  stf    DR     -         -

但是,字符串是写在另一个文件中的(source.txt),每个"path"有四行字符串。

source.txt:

path_sparc_ifu_dec_in_3826
dtu_inst_d[14]
dec_fcl_rdsr_sel_pc_d
0.8664
path_sparc_ifu_dec_in_4349
dtu_inst_d[18]
dec_swl_rdsr_sel_thr_d
0.795429
path_sparc_ifu_dec_in_2374
dtu_inst_d[13]
dec_dcl_cctype_d[2]
0.938914
path_sparc_ifu_dec_in_4011
dtu_inst_d[13]
ifu_exu_useimm_d
0.843643
path_sparc_ifu_dec_in_3078
dtu_inst_d[12]
ifu_exu_shiftop_d[2]
0.915818

期望的输出是:

path_sparc_ifu_dec_in_3826      path_sparc_ifu_dec_in_4349
dtu_inst_d[14]      dtu_inst_d[18]
dec_fcl_rdsr_sel_pc_d       dec_swl_rdsr_sel_thr_d
0.8664  0.795429
path_sparc_ifu_dec_in_2374      path_sparc_ifu_dec_in_4011
dtu_inst_d[13]      dtu_inst_d[13]
dec_dcl_cctype_d[2]     ifu_exu_useimm_d
0.938914    0.843643
path_sparc_ifu_dec_in_3078  
dtu_inst_d[12]  
ifu_exu_shiftop_d[2]    
0.915818    

我的想法是 (1) 先合并两个文件,然后 (2) 使用索引号重新定位路径信息,但我不知道该怎么做。 sed/awk 可能是一种合适的语言。

感谢任何帮助。

最佳,

在玹

一行 awk 解决方案可以是:

awk -F'\t' 'FNR==NR{ind[]=;next} { if( in ind) { l=4*ind[]} else {l=l+1}; text[l]=text[l]"\t" } END { for (i = 0; i < length(text); i++) {print substr(text[i],2)} }' index.txt source.txt

解释:

-F'\t' 

这是使用制表符作为分隔符

FNR==NR

一个接一个地处理文件

{ind[]=;next}

使用第一个文件创建索引

if( in ind) { l=4*ind[]} else {l=l+1}

"l" 是输出文件中的行号。如果字符串在索引中,则行号为 index*4。如果它不在索引中,它是前一个行号 + 1.

text[l]=text[l]"\t"

将当前字符串添加到正确的行。

END { for (i = 0; i < length(text); i++) {print substr(text[i],2)} }

最后打印所有内容。 subrstr只是在这里删除每行的第一个无用标签(第一个字符)

我的数据输出:

path_sparc_ifu_dec_in_3826  path_sparc_ifu_dec_in_4349
dtu_inst_d[14]  dtu_inst_d[18]
dec_fcl_rdsr_sel_pc_d   dec_swl_rdsr_sel_thr_d
0.8664  0.795429
path_sparc_ifu_dec_in_2374  path_sparc_ifu_dec_in_4011
dtu_inst_d[13]  dtu_inst_d[13]
dec_dcl_cctype_d[2] ifu_exu_useimm_d
0.938914    0.843643
path_sparc_ifu_dec_in_3078
dtu_inst_d[12]
ifu_exu_shiftop_d[2]
0.915818

这是另一个适合我的代码。

awk '
NR==FNR         {T[] = 
                 MX = 
                 next
                }
 in T         {IX = T[]
                }
                {P[IX, (FNR+3)%4] = P[IX, (FNR+3)%4] "\t" [=10=]
                }
END             {for (i=0; i<=MX; i++) for (j=0; j<4; j++) print P[i, j]
                }
' index.txt source.txt