用sed代替化学原子序数

用sed代替化学原子序数,sed,Sed,我试图在一个文件中替换一些原子序数模式。该文件在一列中包含一系列原子序数,如第一列所示。现在我想用一系列的数字替换第一列数字,就像第二列中的一行接一行一样 C1 C21 C2 C22 C4 C23 C5 C24 C6 C25 C7 C26 C8 C27 C9 C28 C10 C29 C11 C30 C12 C31 C13 C32 C14 C33 O1 O11 O2 O12 O3 O13 O4 O14 O5 O15 O6 O16 H1 H31 H2 H32 H3

我试图在一个文件中替换一些原子序数模式。该文件在一列中包含一系列原子序数,如第一列所示。现在我想用一系列的数字替换第一列数字,就像第二列中的一行接一行一样

C1  C21
C2  C22
C4  C23
C5  C24
C6  C25
C7  C26
C8  C27
C9  C28
C10 C29
C11 C30
C12 C31
C13 C32
C14 C33

O1  O11
O2  O12
O3  O13
O4  O14
O5  O15
O6  O16

H1  H31
H2  H32
H3  H33
H4  H34
H5  H35
H6  H36
H7  H37
H8  H38
H9  H39
H10 H40
H11 H41
H12 H42
H13 H43
H14 H44
H15 H45
H16 H46
H17 H47
H18 H48
H19 H49
H20 H50
H21 H51
H22 H52
H23 H53
H24 H54
H25 H55
H26 H56
H27 H57
H28 H58
为了实现这一点,我尝试了sed命令,如下所示

 sed -i -e 's/C1/C21/;s/C2/C22/;s/C3/C23/;s/C4/C24/;s/C5/C25/;s/C6/C26/;s/C7/C27/;s/C8/C28/;s/C9/C29/;s/C10/C30/;s/C11/C31/;s/C12/C32/;s/C13/C33/;s/C14/C34/;s/O1/O11/;s/O2/O12/;s/O3/O13/;s/O4/O14/;s/O5/O15/;s/O6/O16/;s/H1/H31/;s/H2/H32/;s/H3/H33/;s/H4/H34/;s/H5/H35/;s/H6/H36/;s/H7/H37/;s/H8/H38/;s/H9/H39/;s/H10/H40/;s/H11/H41/;s/H12/H42/;s/H13/H43/;s/H14/H44/;s/H15/H45/;s/H16/H46/;s/H17/H47/;s/H18/H48/;s/H19/H49/;s/H20/H50/;s/H21/H51/;s/H22/H52/;s/H23/H53/;s/H24/H54/;s/H25/H55/;s/H26/H56/;s/H27/H57/;s/H28/H58/' FILE_NAME
不幸的是,我得到的是多重替换,比如C3328等等


有人能帮我找到正确的方法吗?提前感谢。

在每个图案后放置[^0-9]应该可以正常工作,要使此过程自动化:

awk '$0{printf("s/%s\\([^0-9]\\)/%s\\1/g\n", $1, $2)}' <pattern-file >sedscr
之后,使用为示例文件生成的脚本运行sed

sed -f sedscr sample-files...

在每个图案后放置[^0-9]应该可以正常工作,若要使此过程自动化,请执行以下操作:

awk '$0{printf("s/%s\\([^0-9]\\)/%s\\1/g\n", $1, $2)}' <pattern-file >sedscr
之后,使用为示例文件生成的脚本运行sed

sed -f sedscr sample-files...
问题是sed将尝试按顺序执行所有替换,这将导致多个替换。所以你需要重新安排你的替换,从最具体到最不具体。例如:

echo "C1" | sed -n 's/C1/C21/p; s/C2/C22/p; s/C3/C23/p'
C21
C221
echo "C1" | sed -n 's/C3/C23/p; s/C2/C22/p; s/C1/C21/p'
C21
问题是sed将尝试按顺序执行所有替换,这将导致多个替换。所以你需要重新安排你的替换,从最具体到最不具体。例如:

echo "C1" | sed -n 's/C1/C21/p; s/C2/C22/p; s/C3/C23/p'
C21
C221
echo "C1" | sed -n 's/C3/C23/p; s/C2/C22/p; s/C1/C21/p'
C21

现在还不清楚,但我想这就是你想要的:

$ cat tst.awk
BEGIN { cnt["C"]=21; cnt["O"]=11; cnt["H"]=31 }
NF { c=substr($0,1,1); $0=c cnt[c]++ }
{ print }


现在还不清楚,但我想这就是你想要的:

$ cat tst.awk
BEGIN { cnt["C"]=21; cnt["O"]=11; cnt["H"]=31 }
NF { c=substr($0,1,1); $0=c cnt[c]++ }
{ print }


您的意思是要交换列吗?您的意思是:awk'{print$2,$2}'file>newfile或更容易理解的:awk'{sub$1,$2,$1;print}'@Mark Setchell。我认为发布的文本是一些模式,而不是输入文件。请提供一个示例,以便我们可以使用它。这是一种奇怪的方法。如果您可以一行一行地手动编写所有替换,那么您也可以手动重写该文件。。。查看我的一般解决方案的答案您的意思是要交换列吗?您的意思是:awk'{print$2,$2}'file>newfile或更容易理解的:awk'{sub$1,$2,$1;print}'@Mark Setchell。我认为发布的文本是一些模式,而不是输入文件。请提供一个示例,以便我们可以使用它。这是一种奇怪的方法。如果您可以一行一行地手动编写所有替换,那么您也可以手动重写该文件。。。请参阅我的通用解决方案的答案,因为使用awk生成脚本以使用sed执行从来都不是正确的方法。@EdMorton我看不出其中有什么错误。当然,您可以使用awk生成脚本以使用awk执行,但如果您真正理解问题,我看不出有任何区别。@EdMorton在回答问题或判断其他答案之前,您应该正确理解问题。无论您试图解决什么问题,有些事情都是错误的。使用awk生成sed脚本就是其中之一。因为使用awk生成要使用sed执行的脚本从来都不是正确的方法。@EdMorton我看不出其中有什么错误。当然,您可以使用awk生成脚本以使用awk执行,但如果您真正理解问题,我看不出有任何区别。@EdMorton在回答问题或判断其他答案之前,您应该正确理解问题。无论您试图解决什么问题,有些事情都是错误的。使用awk生成sed脚本就是其中之一。