ファイルの各行を同じ数の部分に分割するコマンド (sed または AWK の 1 行コマンド) を誰かが提案してくれれば幸いです。たとえば、各行を 4 つの部分に分割します。
入力:
ATGCATHLMNPHLNTPLML
出力:
ATGCA THLMN PHLNT PLML
awk はこれに最適なツールではないと思いますが、次のとおりです。
gawk --posix '{ l = sprintf( "%d", 1 + (length()-1)/4);
gsub( ".{"l"}", "& " ) } 1' input-file
posix 準拠の awk を使用している場合は --posix を省略できますが、gnu awk には --posix が必要であり、それが最も一般的に使用される実装であるように思われるため、gawk に関して解決策を示しました。
これは、GNU sed を使用して動作するはずです。
sed -r 's/(.{4})/\1 /g'
-r
拡張正規表現を使用するために必要です.{4}
4文字ごとにキャプチャ\1
括弧で囲まれたキャプチャされたグループを参照し、(
)
このグループの後ろにスペースを追加しますg
各行で可能な限り何度も置換が行われるようにしますテスト; これは私の端末の入力と出力です:
$ echo "ATGCATHLMNPHLNTPLML" | sed -r 's/(.{4})/\1 /g'
ATGC ATHL MNPH LNTP LML
これはあなたのために働くかもしれません(GNU sed):
sed 'h;s/./X/g;s/^\(.*\)\1\1\1/\1 \1 \1 \1/;G;s/\n/&&/;:a;/^\n/bb;/^ /s/ \(.*\n.*\)\n\(.\)/\1 \n\2/;ta;s/^.\(.*\n.*\)\n\(.\)/\1\2\n/;ta;:b;s/\n//g' file
説明:
h
パターンスペース(PS)をホールドスペース(HS)にコピーしますs/./X/g
HS内のすべての文字を同じ非スペース文字(この場合X
)に置き換えますs/^\(.*\)\1\1\1/\1 \1 \1 \1/
行を4つの部分に分割します(スペースで区切ります)G
PSにHSの内容が続く改行を追加しますs/\n/&&/
改行を2倍にします(後でマーカーとして使用されます):a
ループ名前空間を導入する/^\n/bb
改行に到達すると、完了してb
名前空間に分岐します/^ /s/ \(.*\n.*\)\n\(.\)/\1 \n\2/;ta;
最初の文字がスペースの場合、この時点で実数直線にスペースを追加して繰り返しますs/^.\(.*\n.*\)\n\(.\)/\1\2\n/;ta
他のキャラクターはただぶつかって繰り返します:b;s/\n//g
マーカーを削除して結果を印刷するだけですべて完了これは任意の長さの線で機能しますが、線は4で正確に割り切れないため、最後の部分には余りも含まれます。
perl
ここではより良い選択かもしれません:
export cols=4
perl -ne 'chomp; $fw = 1 + int length()/$ENV{cols}; while(/(.{1,$fw})/gm) { print $1 . " " } print "\n"'
これにより、すべての行のフィールド幅が再計算されます。
GNU coreutils の代替である field-width は、次の最初の行に基づいて選択されinfile
ます。
cols=4
len=$(( $(head -n1 infile | wc -c) - 1 ))
fw=$(echo "scale=0; 1 + $len / 4" | bc)
cut_arg=$(paste -d- <(seq 1 $fw 19) <(seq $fw $fw $len) | head -c-1 | tr '\n' ',')
cut_arg
上記の場合の値は次のとおりです。
1-5,6-10,11-15,16-
次に、行を適切なチャンクに分割します。
cut --output-delimiter=' ' -c $cut_arg infile