使用索引文件中的 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
我将永远感谢来自该网站的所有帮助。我想根据索引文件中的索引号重新定位字符串。
索引号显示在索引文件的第一列 (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