たとえば、文字列を含むファイルがあります。
ATCGGTCAA
各行に各 3 文字のみが表示されるように、3 文字ごとに改行する必要があります。
ATC
GGT
CAA
この変換をシェルで行うにはどうすればよいですか?
foldシェル コマンドを使用します。
fold -w3
perl -e '$/=\3; while(<>) { print $_ . "\n" }'
Python バージョン:
chunk = in.read(3)
while len(chunk) > 0:
out.write(chunk + "\n")
chunk = in.read(3)
と呼ばれるUNIXコマンドがありますfold
:
fold -3 < inputfile > outputfile
楽しみのために:
,[.,.,.[-]++++++++++.,]
while (<>) {
chomp;
print("$_\n") for /.{1,3}/sg;
}
スクリプトレス: (別名ワンライナー別名 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 1 行:
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
...