我有一个包含多个文本文件的文件夹,我需要使用多个替换列表进行处理和格式化,如下所示:
old string1~new string1
old string2~new string2
etc~blah
我在这些多个文本文件的每一行上从替换列表中运行每个替换对。现在我有一组python脚本来执行此操作。我想知道的是,如果我切换到sed或awk,它会使代码更简单,更易于维护吗?它会是一个更好的解决方案还是我应该更好地改进我的Python代码?我问,因为传入的文本文件定期出现并且通常具有与以前不同的结构,例如错误,拼写错误,多个空格,因为这些文件是由人类创建的。因此,我必须不断调整我的代码和替换列表,以使其正常工作。 感谢。
答案 0 :(得分:4)
除非您的python代码非常糟糕,否则切换到awk不太可能使其更易于维护。也就是说,它在awk中非常简单,但不能很好地扩展:
cat replacement-list-files* | awk 'FILENAME == "-" {
split( $0, a, "~" ); repl[ a[1] ] = a[2]; next }
{ for( i in repl ) gsub( i, repl[i] ) }1' - input-file
请注意,这一次只能在一个文件上运行。将1
替换为{ print > ( FILENAME ".new" ) }
以处理多个文件,但如果要处理大量文件,则必须处理关闭文件,并且很快就会成为难以维护的混乱。如果您已经有了可行的解决方案,请坚持使用Python。
答案 1 :(得分:0)
这是正则表达式替换脚本(大多数情况下与@WilliamPursell发布的内容完全不同):
awk -F'~' '
NR==FNR{ map[$1] = $2; next }
{
for (old in map) {
gsub(old,map[old]
}
}
' /wherever/mappingFile file
但是这里是我认为你真正需要的字符串替换脚本:
awk -F'~' '
NR==FNR{ map[$1] = $2; next }
{
for (old in map) {
rlength = length(old)
while (rstart = index($0,old)) {
$0 = substr($0,1,rstart-1) map[old] substr($0,rstart+rlength)
}
}
}
' /wherever/mappingFile file
在任何一种情况下,只需将其封装在shell循环中以影响多个文件:
for file in *
do
awk -F'~' '...' /wherever/mappingFile "$file" > tmp && mv tmp "$file"
done