1

ファイルの各行を同じ数の部分に分割するコマンド (sed または AWK の 1 行コマンド) を誰かが提案してくれれば幸いです。たとえば、各行を 4 つの部分に分割します。

入力:

ATGCATHLMNPHLNTPLML

出力:

ATGCA THLMN PHLNT PLML
4

4 に答える 4

1

awk はこれに最適なツールではないと思いますが、次のとおりです。

gawk --posix '{ l = sprintf( "%d", 1 + (length()-1)/4);
    gsub( ".{"l"}", "& " ) } 1' input-file

posix 準拠の awk を使用している場合は --posix を省略できますが、gnu awk には --posix が必要であり、それが最も一般的に使用される実装であるように思われるため、gawk に関して解決策を示しました。

于 2012-09-27T17:42:39.110 に答える
1

これは、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
于 2012-09-27T16:40:38.603 に答える
0

これはあなたのために働くかもしれません(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/gHS内のすべての文字を同じ非スペース文字(この場合X)に置き換えます
  • s/^\(.*\)\1\1\1/\1 \1 \1 \1/行を4つの部分に分割します(スペースで区切ります)
  • GPSに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で正確に割り切れないため、最後の部分には余りも含まれます。

于 2012-09-27T20:35:35.367 に答える
0

パール

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
于 2012-09-27T20:24:53.180 に答える