n番目の文字の後に列を分割する

n番目の文字の後に列を分割する

下のファイルの2番目の列を4文字ごとに分割しようとしています。

ファイル.txt

>1A    THISISATEST
>1B    THATISATEST

希望の出力:

>1A    THIS    ISATEST
>1B    THAT    ISATEST

検索して修正しようとしたら、次のsedコマンドを使用してみましたsed 's/(.{4})(.{7}).*/\2 \3/' file.txt。しかし、私はそれを動作させることができないようです。私は何を逃したことがありませんか?しかし、提案があればそれawkも役に立ちます。また、あなたの提案について説明してください。私はawk学ぶ過程にいますsed

答え1

ここに解決策がありますawk。最初の4文字と2番目の列の残りの部分を2つの変数に分割して印刷します。

]$ awk '{s=substr($2,1,4)}{g=substr($2,5,length($2))}{print $1,s,g}' file.txt
1A THIS ISATEST
1B THAT ISATEST

答え2

そしてsed

sed 's/^[^ ]\+ \+[^ ]\{4\}/&\t/'

仕組み:

  • ^:行の始まり
  • [^ ]\+:少なくとも1回以上の空白文字と一致しません。
  • \+: 空白文字が複数回一致します。
  • [^ ]\{4\}:空白以外の文字を正確に4回一致します。
  • &:一致する前のすべて//
  • \t: ラベル

出力:

>1A    THIS ISATEST
>1B    THAT ISATEST

正しいこと:

sed 's/^[^ ][^ ]*  *[^ ]\{4\}/&\t/'

このモードはGNU拡張であるため、posix互換性のために+繰り返し文字とaを使用してエミュレートする必要があります。*

答え3

sed 's/ [^ ]\{1,4\}/& /' <in >out

>1A    THIS ISATEST

動作します。<スペース>空白文字の直後に、空白ではなく1〜4個の文字シーケンスが最初に表示される最も長い一致の後です。つまり、行が空白で始まると、空白ではなく最初のシーケンスに影響します。(これは間違いなく正しい行動です)、それ以外のスペースで区切られた2番目の列が4文字以下の文字で構成されている場合、その列に追加のスペースが追加されます。(これは間違いなく間違った行動です)

いずれにせよ、スペースを置き換えません。すべて2番目の列の空白ではなく、4番目の文字です。ただし、サンプル入力をサンプル出力に変換します。

答え4

そしてGNU awkあなたはそれを使用することができますFPAT

awk '{$1=$1}1' OFS='\t' FPAT='>..\\s+\\w{4}|\\w*$'
  • 式は文字列の残りの部分と>..\\s+\\w{4}一致し>1A THIS、一致します。\\w*$

  • $1=$1出力文字列に新しい区切り文字を使用するよう強制するOFS

  • 1代替品です{print $0}

関連情報