【发布时间】:2018-07-21 00:29:51
【问题描述】:
我正在尝试使用 SED 脚本进行模式替换,但它无法正常工作
sample_content.txt
288Y2RZDBPX1000000001dhana
JP2F64EI1000000002d
EU9V3IXI1000000003dfg1000000001dfdfds
XATSSSSFOO4dhanaUXIBB7TF71000000004adf
10Q1W4ZEAV18LXNPSPGRTTIDHBN1000000005egw
patterns.txt
1000000001 9000000003
1000000002 2000000001
1000000003 3000000001
1000000004 4000000001
1000000005 5000000001
预期输出
288Y2RZDBPX9000000003dhana
JP2F64EI2000000001d
EU9V3IXI3000000001dfg9000000003dfdfds
XATSSSSFOO4dhanaUXIBB7TF74000000001adf
10Q1W4ZEAV18LXNPSPGRTTIDHBN5000000001egw
我可以像
sed 's/1000000001/1000000003/g' sample_content.txt
注意:
- 匹配模式不在固定位置。
- sample_content.txt 中单行可能有多个匹配值要替换
- Sample_content.txt 和 patterns.txt 的记录超过 100 万条
文件附件链接:https://drive.google.com/open?id=1dVzivKMirEQU3yk9KfPM6iE7tTzVRdt_
谁能建议如何在不影响性能的情况下实现这一目标?
2018 年 2 月 11 日更新
在分析了真实文件后,我得到了一个提示,在 30 和 31 位有一个 grade 值。这有助于我们在哪里和所有需要应用替换。
如果 AB 级,则替换 41-50 和 101-110 的 10 位电话号码
如果 BC 级,则替换 11-20、61-70 和 151-160 处的 10 位电话号码
如果 DE 级,则将 10 位电话号码替换为 1-10、71-80、151-160 和 181-190
像这样,我看到 200 万 个样本记录的 50 个独特等级。
{ grade=substr($0,110,2)} // identify grade
{
if (grade == "AB") {
print substr($0,41,10) ORS substr($0,101,10)
} else if(RT == "BC"){
print substr($0,11,10) ORS substr($0,61,10) ORS substr($0,151,10)
}
like wise 50 coiditions
}
我想知道,这种方法是可取的还是其他更好的方法?
【问题讨论】:
-
回复:
> 1 Million records&&without affecting performance祝你好运 -
@Сухой27,我完全赞同你。
-
到目前为止,您获得的两种解决方案都将每个替换应用于整个输入行,而不是在先前替换之后的输入行的其余部分,例如,如果包含 sample_content.txt
xay和 patterns.txt 包括a b和b c,然后工具将输出xcy- 是预期输出还是应该是xby?无论哪个正确,您都应该在示例输入中包含一个测试该案例的案例。 -
@RavinderSingh13 OP 明确表示
Single line may have multiple matching value to replace in sample_content.txt因此在第一场比赛后跳出循环,虽然速度更快,但不会产生预期的输出。我还认为只对每个匹配的字符串进行 1 次替换,而不是替换每行上每个字符串的所有出现(就像你的两个脚本都使用 sub() 而不是 gsub())是不正确的。 -
@EdMorton,Ed 先生,我明白了,你说得对。