如何使用perl或awk对文件中的数字执行数算?
我有一个文件A.txt:RS0255\u RS0083:115124129141143168170180rs0343\u RS0083:112113163175181rs0343\u RS0255:94101107164179183我想对后面的数字执行数算:
解答动态
有很多工具可以用来对文本文件进行不同的操作。对于你提到的具体案例,我可能会使用perl:
$perl-pe's/\b(\d+)\b/$1+10/ge'文件A.txtRS0255\u RS0083:125134139151153178180190rs0343\u RS0083:122123173185191rs0343\u RS0255:104111117174189193gawk'$0+0=$0{$0+=10}{ORS=RT}1'RS='[:,\n]'文件
An awk答案:将每行分析为两个:-分隔字段。对第二个字段使用split()将其拆分为逗号上的字段,并在循环中修改拆分字段,从而创建新的输出记录。然后用逗号分隔符输出新记录,原始第一个字段作为前缀。
awk-F:'BEGIN{OFS=quot;}{prefix=$1 nf=split($2,a,quot;)$0=lt;=nf;+++i)$i=a[i]+10 printfquot;,前缀,$0}'文件a.txt 输出将是
rs0255\u RS0083:125134139151153178180190rs0343\u RS0083:122123173185191rs0343\u RS0255:104111117174189193 以上代码的更简洁的表示(对于那些认为一行更好的代码):
awk-F:'{p=$1;n=split($2,a,quot;);$0=lt;n;++i)$i=a[i]+10;printfquot;,p,$0}'OFS=,文件a.txt Older回答,这并不像上面说的那么“好”一:
使用awk并将每一行解释为由:或、分隔的字段列表,在每行的第二个字段上加10线路:
awk-F“[:,]”开始{OFS=quot;}{for(i=2;iquot;,lt;=NF;+++i)$i+=10};1' 文件A.txtsed's/,/:/'
awk-F,-v OFS=,'{split($1,tmp,quot;);$1=tmp[1]quot;tmp[2]+10;for(i=2;i<;=NF;i++)$i+=10;}1'infle
I提出这个建议awk:
$awk-F':,''开始{OFS=quot;:quot;;for(i=2;iquot;,";}}}1'文件RS0255\u RS0083:125134139151153178180190rs0343\u RS0083:122123173185191rs0343\u RS0255:104111117174189193
使用带逗号的渐进式切片的awk动态重新创建字段。
awk-F:-v of s=,'{f1=$1 FS;f2=$2 of s n=0;$0=";而(p=索引(f2,OFS)){$(++n)=10+子序列(f2,1,p-1)f2=子序列(f2,p+1)}$1=f1$1}1'文件A.TXT 输出:
RS0255\u RS0083:125134139151153178180190rs0343\u RS0083:122123173185191rs0343\u RS0255:104111117174189193 perl-pe'/:/g;s/\g(\d+)(\d)/($1+10)。$2/ge;'文件A.txt#或者,不要打印!$-- ? /(.*)(.*)(.*)/s;'文件A.txt
- End
免责声明:
本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。