我想删除文件中重复的字符串块
一个块由四行组成,例如:
路径名称
起点
结束点
电压数
如果结束点重复,我想删除同一行(?)上的重复块 例如,第一个和第二个块的结束点在第一行中是相同的,我想只保留第一个块。因此,第二行上的第二个块被删除。
在第二行中,第一个和第三个块的结束点相同并保留第一个块。
input.txt中:
path_sparc_ffu_dp_out_1885 path_sparc_ffu_dp_out_2759 path_sparc_ffu_dp_out_3115
R_1545/Q R_1541/Q R_1545/Q
dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[2]
0.926208 0.910592 0.905082
path_sparc_ffu_dp_out_699 path_sparc_ffu_dp_out_712 path_sparc_ffu_dp_out_819
R_1053/Q R_1053/Q R_1053/Q
dp_ctl_synd_out_low[2] dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[2]
0.945436 0.945436 0.9435
output.txt的:
path_sparc_ffu_dp_out_1885 path_sparc_ffu_dp_out_3115
R_1545/Q R_1545/Q
dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[2]
0.926208 0.905082
path_sparc_ffu_dp_out_699 path_sparc_ffu_dp_out_712
R_1053/Q R_1053/Q
dp_ctl_synd_out_low[2] dp_ctl_synd_out_low[6]
0.945436 0.945436
我认为awk / sed可以完成这项工作。任何帮助表示赞赏。
最佳,
Jaeyoung
答案 0 :(得分:1)
此解决方案可以假设输入数据:
$ sed -r 's/(dp_ctl_synd_out_low\[[0-9]\])(.+)(\1)/\1 \2 -/g' input.txt | paste - - - - | awk '{ $8=="-"?dup=2:dup=3; for(i=1;i<=NF;i++){if(dup!=((i-1)%3+1)){print $i}} }' | paste - -
path_sparc_ffu_dp_out_1885 path_sparc_ffu_dp_out_3115
R_1545/Q R_1545/Q
dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[2]
0.926208 0.905082
path_sparc_ffu_dp_out_699 path_sparc_ffu_dp_out_712
R_1053/Q R_1053/Q
dp_ctl_synd_out_low[2] dp_ctl_synd_out_low[6]
0.945436 0.945436
我将逐步解释解决方案如下:
用减号代替重复的结束点:
sed -r 's/(dp_ctl_synd_out_low\[[0-9]\])(.+)(\1)/\1 \2 -/g' input.txt
在一行中显示块:
paste - - - -
使用awk
,排除重复列(第二个或第三个):
# find if the duplicate is in the second or in the third column
$8=="-"?dup=2:dup=3;
# exclude all the seconds or thirds fields (previous calculated)
for(i=1;i<=NF;i++){
if(dup!=((i-1)%3+1)){
print $i
}
}
最后paste
以原始格式显示数据:
paste - -
我希望这可以帮到你。