我有一个包含字符串的文件,例如:
ATCGGTCAA
我需要在每三个字符之后添加一个新行,这样每行只出现每三个字符,例如:
ATC
GGT
CAA
如何在 shell 中进行这种转换?
使用折叠外壳命令:
fold -w3
perl -e '$/=\3; while(<>) { print $_ . "\n" }'
有一个名为的 unix 命令fold
:
fold -3 < inputfile > outputfile
一个python版本:
chunk = in.read(3)
while len(chunk) > 0:
out.write(chunk + "\n")
chunk = in.read(3)
纯娱乐:
,[.,.,.[-]++++++++++.,]
while (<>) {
chomp;
print("$_\n") for /.{1,3}/sg;
}
无脚本:(又名 one-liner aka bash)
perl -nle'print for /.{1,3}/sg' file.in >file.out
perl -i~ -nle'print for /.{1,3}/sg' file # In-place
特征:
(更新)请注意,当前发布的所有其他解决方案(William Pursell、Hunter McMillen 和 anttix)都添加了一个空行。(更新)和 jterrace 的
您可以在字符串长度上使用模数运算符很容易地做到这一点。
伪代码:
myString = "ATCGGTCAA";
count = 0;
for(c in myString)
{
if((count+1) % 3 == 0 && count != 0) print "\n";
print c;
}
假设 Linux 上的 GNU sed
sed -i .bak -e 's/.../&\n/g' file.txt
另一个python单行:
a = 'ATCGGTCAA'
splitted = '\n'.join([a[i:i+3] for i in range(len(a) / 3)])
一个过于聪明(但很有趣)的 python 2-liner:
a=iter( 'ATCGGTCAA' )
print '\n'.join( ''.join(x) for x in zip(a,a,a) )
...
in=f.read() #'ATCGGTCAA...'
out=''
count=0
for i in s:
out+=i
count+=1
if not count%3:
out+='\n'
print>>f2, out
输出:
ATC
GGT
CAA
...