下のファイルの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}