0

我有一个包含字符串的文件,例如:

ATCGGTCAA

我需要在每三个字符之后添加一个新行,这样每行只出现每三个字符,例如:

ATC
GGT
CAA

如何在 shell 中进行这种转换?

4

11 回答 11

10

使用折叠外壳命令:

fold -w3
于 2012-07-26T19:47:07.830 回答
2
perl -e '$/=\3; while(<>) { print $_ . "\n" }'
于 2012-07-26T19:43:12.183 回答
1

有一个名为的 unix 命令fold

fold -3 < inputfile > outputfile
于 2012-07-26T19:48:19.850 回答
1

一个python版本:

chunk = in.read(3)
while len(chunk) > 0:
    out.write(chunk + "\n")
    chunk = in.read(3)
于 2012-07-26T19:50:48.357 回答
0

纯娱乐:

,[.,.,.[-]++++++++++.,]
于 2012-07-26T21:56:47.780 回答
0
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 的

于 2012-07-26T19:41:43.953 回答
0

您可以在字符串长度上使用模数运算符很容易地做到这一点。

伪代码:

myString = "ATCGGTCAA";
count = 0;

for(c in myString)
{  
   if((count+1) % 3 == 0 && count != 0) print "\n";
   print c;
}
于 2012-07-26T19:43:34.080 回答
0

假设 Linux 上的 GNU sed

sed -i .bak -e 's/.../&\n/g' file.txt
于 2012-07-26T19:43:38.063 回答
0

另一个python单行:

a = 'ATCGGTCAA'
splitted = '\n'.join([a[i:i+3] for i in range(len(a) / 3)])
于 2012-07-26T19:45:28.197 回答
0

一个过于聪明(但很有趣)的 python 2-liner:

a=iter( 'ATCGGTCAA' )
print '\n'.join( ''.join(x) for x in zip(a,a,a) ) 
于 2012-07-26T19:48:35.077 回答
0
...
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
...
于 2012-07-26T19:51:26.313 回答