Shell 在unix中替换相似字符
我正在使用以下命令Shell 在unix中替换相似字符,shell,unix,awk,Shell,Unix,Awk,我正在使用以下命令 awk -f script.sh dictionary.txt "test.txt" >> "test2.txt" 替换.txt中的某些字符。我的脚本如下: NR == FNR { rep[$1] = $2 next } { for (key in rep) { gsub(key, rep[key]) } print } 这是我的字典: I 0:maj[ |]* i 0:min[ |]* bII 1:ma
awk -f script.sh dictionary.txt "test.txt" >> "test2.txt"
替换.txt中的某些字符。我的脚本如下:
NR == FNR {
rep[$1] = $2
next
}
{
for (key in rep) {
gsub(key, rep[key])
}
print
}
这是我的字典:
I 0:maj[ |]*
i 0:min[ |]*
bII 1:maj[ |]*
II 2:maj[ |]*
ii 2:min[ |]*
bIII 3:maj[ |]*
III 4:maj[ |]*
iii 4:maj[ |]*
IV 5:maj[ |]*
iv 5:min[ |]*
V 7:maj[ |]*
v 7:min[ |]*
bVI 8:maj[ |]*
VI 9:maj[ |]*
vi 9:min[ |]*
bVII t:maj[ |]*
VII e:maj[ |]*
vii e:min[ |]*
for (key in rep) {
gsub(key, rep[key])
}
我面临两个问题:
1 II或II、III、VI等不是作为一个独立的实体来阅读,而是作为两个I。我如何在我的脚本中指定第一列中的所有内容都应该作为一个字符块来阅读。我试着使用,[];没什么好做的。我可以用I{2}来区分ii和I,但我不能用vi这样的东西
2第二列中的空格字符会产生一些问题。我试着逃避,但没用
有什么把戏吗
[编辑]这是一个.txt的示例
I ii V V
I II V V
I ii IV V
I ii III IV
I ii vi IV
I ii iii IV
I II IV V
I IV I ii
i ii V V
i ii V V
i II V V
i ii iv V
i ii IV V
i ii vi IV
下面是一个示例输出的备选方案:
$ awk 'NR==FNR{k=$1; $1=""; r[k]=substr($0,2);next} {for (i=1;i<=NF;i++){if ($i in r) {$i=r[$i]}}} {print}' dictionary.txt "test.txt"
0:maj[ |]* 2:min[ |]* 7:maj[ |]* 7:maj[ |]*
0:maj[ |]* 2:maj[ |]* 7:maj[ |]* 7:maj[ |]*
0:maj[ |]* 2:min[ |]* 5:maj[ |]* 7:maj[ |]*
0:maj[ |]* 2:min[ |]* 4:maj[ |]* 5:maj[ |]*
0:maj[ |]* 2:min[ |]* 9:min[ |]* 5:maj[ |]*
0:maj[ |]* 2:min[ |]* 4:maj[ |]* 5:maj[ |]*
0:maj[ |]* 2:maj[ |]* 5:maj[ |]* 7:maj[ |]*
0:maj[ |]* 5:maj[ |]* 0:maj[ |]* 2:min[ |]*
0:min[ |]* 2:min[ |]* 7:maj[ |]* 7:maj[ |]*
0:min[ |]* 2:min[ |]* 7:maj[ |]* 7:maj[ |]*
0:min[ |]* 2:maj[ |]* 7:maj[ |]* 7:maj[ |]*
0:min[ |]* 2:min[ |]* 5:min[ |]* 7:maj[ |]*
0:min[ |]* 2:min[ |]* 5:maj[ |]* 7:maj[ |]*
0:min[ |]* 2:min[ |]* 9:min[ |]* 5:maj[ |]*
例如,如果在ii之前检索到i,则输入ii被视为两个连续的i。这里有一个示例输出的替代方案:
$ awk 'NR==FNR{k=$1; $1=""; r[k]=substr($0,2);next} {for (i=1;i<=NF;i++){if ($i in r) {$i=r[$i]}}} {print}' dictionary.txt "test.txt"
0:maj[ |]* 2:min[ |]* 7:maj[ |]* 7:maj[ |]*
0:maj[ |]* 2:maj[ |]* 7:maj[ |]* 7:maj[ |]*
0:maj[ |]* 2:min[ |]* 5:maj[ |]* 7:maj[ |]*
0:maj[ |]* 2:min[ |]* 4:maj[ |]* 5:maj[ |]*
0:maj[ |]* 2:min[ |]* 9:min[ |]* 5:maj[ |]*
0:maj[ |]* 2:min[ |]* 4:maj[ |]* 5:maj[ |]*
0:maj[ |]* 2:maj[ |]* 5:maj[ |]* 7:maj[ |]*
0:maj[ |]* 5:maj[ |]* 0:maj[ |]* 2:min[ |]*
0:min[ |]* 2:min[ |]* 7:maj[ |]* 7:maj[ |]*
0:min[ |]* 2:min[ |]* 7:maj[ |]* 7:maj[ |]*
0:min[ |]* 2:maj[ |]* 7:maj[ |]* 7:maj[ |]*
0:min[ |]* 2:min[ |]* 5:min[ |]* 7:maj[ |]*
0:min[ |]* 2:min[ |]* 5:maj[ |]* 7:maj[ |]*
0:min[ |]* 2:min[ |]* 9:min[ |]* 5:maj[ |]*
例如,如果在ii之前检索到i,则输入ii被视为两个连续的i。不使用gsub,只需遍历每个字段并直接交换:
NR == FNR {
rep[$1] = $2 " " $3
next
}
{
for (i=1; i<=NF; ++i) {
if ($i in rep) $i = rep[$i]
}
print
}
不使用gsub,只需遍历每个字段并直接交换:
NR == FNR {
rep[$1] = $2 " " $3
next
}
{
for (i=1; i<=NF; ++i) {
if ($i in rep) $i = rep[$i]
}
print
}
test.txt是什么样子的?第二列中没有空格字符。而是有三列。test.txt是什么样子的?第二列中没有空格字符。相反,这里有三个专栏。伟大的人物思想相似!实际上,我正在考虑做与您相同的事情来获取密钥,但在每个值之前都会留出额外的空间。@TomFenech这就是为什么我添加了substr来删除该空间。太棒了!谢谢你们,诸位智者都有同感!实际上,我正在考虑做与您相同的事情来获取密钥,但在每个值之前都会留出额外的空间。@TomFenech这就是为什么我添加了substr来删除该空间。太棒了!谢谢你们