パターンで区切られた連続行グループを結合する技術

パターンで区切られた連続行グループを結合する技術

次のリストがあります。

$$<002L_tbfl
Putative transcription factor 001R;
GO:0006355
GO:0046782
GO:0006351
IPR007031
$$<002L_FRG3G
Uncharacterized protein 002L;
GO:0033644
GO:0016021
IPR004251

私はそれぞれが新しい行を開始して再び表示される$$<まで、同じ行(タブで区切られた)に次の項目を持たせたいと思います。$$<このように:

$$<002L_tbfl    Putative transcription factor 001R; GO:0006355  GO:0046782  GO:0006351  IPR007031
$$<002L_FRG3G   Uncharacterized protein 002L;   GO:0033644  GO:0016021  IPR004251

これまでの私のアプローチは次のとおりです。

tr '\n' '\t'   < stage1 > stage2
sed 's/$$</\n/g' stage2 > stage3

問題は、上記の方法が小さなファイルでは完全に機能しますが、4 GBファイルでは機能しているように見える次の短い時間にエラーやメッセージなしで空のファイルを返すことです。
私も試してみましたが、tr '$$<' '\n'うまくいきません。奇妙なファイルが生成されます。

ベストアンサー1

実行方法は次のとおりですsed

sed -n '/$$</! H; /$$</{x; s/\n/\t/gp}; ${x; s/\n/\t/gp}' stage1 > stage3

部分に分かれています:

  • sed -nデフォルト出力(つまり、処理された入力)が印刷されず、pコマンドを受け取った場合にのみ印刷されることを意味します。
  • /$$</! H線が見える時を意味します。いいえ含まれている場合は$$<「に追加してください。時間前のスペース"(たとえば、準備領域)。これは、一般的なロジックを反転して、"この条件を満たさない行に対してこれを実行することを!意味します。$$<(および(たとえば、行の前に改行を挿入するなどの行の途中を別々に処理する必要がある/^$$</場合は、それを記録するように質問を編集してください。)$$<

    予約済みスペース(予約済みスペース)に既にコンテンツがある場合予約済みスペースに行を追加する場合、その間sedに改行文字を挿入すると、予約済みスペースに次のテキストが作成されます。

    $$<002L_tbflnewline推定転写因子001Rnewline移動:0006355…

    スペースを「パターンスペース」(通常の作業行バッファー)として予約 一般的に言えば最後に明示的な改行文字はありません(暗黙的です)。もちろん、スペース内に明示的に改行文字を挿入できます。

  • /$$</{…}中かっこで囲まれたコマンドを含む行で実行されることを示します$$<

    • xeを意味するX予約済みスペースとパターンスペースの内容を変更します。
    • s/\n/\t/gp意味 - まあ、当然のことです、そうですか? - これは(パターンスペースで)改行文字をタブに置き換えることを意味します。 G世界中で結果を印刷します。

    このコマンドが入力の最初の行(を含む$$<)を読み取ると、xその行($$<002L_tbfl)をパターンスペースから予約済みスペースに移動し、予約済みスペースの前の内容をパターンスペースに移動します。ただし、予約済みスペースの最初の内容は何もないため、コマンドは適用されませんs。後で(たとえば、7行目で)表示すると$$<(上記のように)、新しい行を含むテキストをパターンスペースにインポートし(上記のように)、すべての改行をタブに置き換えて結果を印刷します。

  • ${…}入力の終わりに達すると、中かっこで囲まれたコマンドが実行されることを示します。これは$$<、予約済みスペースで最後の行(つまり、最後の行)をクリアするためにを表示したときに実行したのと同じコマンドです。

警告:POSIXでの動作は保証されませんsed。私はそれをGNUでテストしましたsed

おすすめ記事