サブグループを作成するためにテーブルに改行を追加する方法はありますか?

サブグループを作成するためにテーブルに改行を追加する方法はありますか?

これをどのように表現するのか悩んでいるため、Google-fuは失敗します。

データテーブルを含むテキストファイルがあります。サブグループを視覚的に区別するために改行を挿入したいと思います。

たとえば、次のように起動した場合:

jan   ford
jan   trillian
mar   trillian
sep   marvin

最初のフィールドは私のサブグループフィールドなので、出力は次のようになります。

jan   ford
jan   trillian

mar   trillian

sep   marvin

同じ月の2行を識別するのと同じことができますが、異なる^(a-z){3}\t(.*)\n\1\t(.*)$場合はどのように一致させるのかわかりません。

理想的には、これはBBeditに含めることができる正規表現であることを望みますが、他のソリューションも開いています。

答え1

bbedit一種の有料OSXエディタのように見えます。一度も使ったことがないし、インストールもできないので助けができません。表示された正規表現に基づいて独自の正規表現構文があるため、これを使用する一般的な*nixサイトでソリューションを見つける可能性はほとんどありません。しかし、ここには他のオプションがあります。どちらの場合も、最初のフィールドを保存し、前の行で見たものと異なる場合は、空の行を印刷することをお勧めします。

$ awk '{if($1!=last && NR>1){print ""}last=$1;}1;' file
jan ford
jan trillian

mar trillian

sep marvin

awkフィールドベースのデータを処理するように設計されたスクリプト言語です。自動的に各行をフィールドに分割してから...と呼び出すことができます$1。したがって、上記のスクリプトは変数の最初のフィールドを保存し、最初の行を除くすべての行(つまりこれが意味するもの)に対して現在保存されている値と異なる場合は空の行を印刷します。awk は「各行印刷」の略です。$2$NlastNR>1last1;

または、以下でこれを行うことができますperl

$ perl -lape '$F[0] ne $last && $.>1 && print ""; $last=$F[0]' file
jan ford
jan trillian

mar trillian

sep marvin

ここでは、perlコマンドラインスイッチを使用してほとんどのタスクを実行します。 makeは、各入力ラインを配列に分割するのと同様に-a機能します。最初のフィールドです。各呼び出しに改行文字を追加することで、空行のみが印刷されます。与えられたスクリプトを適用した後、各入力行を印刷するようにします。スクリプト自体は上記のスクリプトとまったく同じです。perlawk@F$F[0]-lperlprintprint ""-p-eawk

答え2

awk 'NR > 1 && $1 != last {print ""}; {print; last = $1}'

答え3

リピータを一致させることができるので、動作を無効にしたいと思います。次のことができます。

sed -e'/^\n/!{$n;G;N;s/^\(\(...\).*\)\n\2/\1\2/;}' -eP\;D <in >out

つまり、二重間隔のファイルで始まり、グループ間の2番目のスペースを削除します。

例 入力印刷に対して次のコマンドを実行します。

jan   ford
jan   trillian

mar   trillian

sep   marvin

これは実際にあなたに質問を投げさせます。私はTrillianが平行宇宙で2回の誕生日を持つことができることを知っていると思います。しかし、Marvinが誕生日を持つことができると思う理由を説明できますか?それでも9月がより適していると思います。いつも落ち込んでいます。


ここに別のものがあります。 @don_crissti 提供(若干修正された場合):

sed -etD -e'$q;N;/^\(...\).*\n\1/!s/\n/&&/;:D' -eP\;D

私は彼が好きです。彼は最初に私にこう尋ねました。単に編集するのではなく、改行文字を編集するのはなぜですか?私は実際には何の答えも持っておらず、それが大きな変化をもたらすとは思わないので、ほとんど両面的です。

しかし、問題は、ここで使用される予測技術にはブレードバッファが必要であることです。バッファが一度に現在2つの入力ラインよりも大きくなると、誤った肯定を報告する可能性があります。一致する同じストリームに改行を実際に挿入し、挿入された入力行または挿入する必要がある行を簡単に区別できる必要がある場合、単一行プレビューのバランスを取ることは読みにくくなります。このバランスには以下が必要です。少なくとも/^\n/!サイクルごとに1つの追加テスト - 上記のテストに合格しました。

ただし、sedメカニズムの非常に基本的な部分は、成功時に条件付きブランチを実行するs///代替文の予想戻りです。t彼の交換は常に追加の行を生成するため、パターンスペースが削除され、estがまだスクリプトの上部で動作しているときにsedラインループ(estの戻りを消去する)は反転しません。tこの方法は、各挿入をテストし、次の反復に加えて前の反復結果を安定的に評価することを非常に簡単にしません。Dtt

したがって、彼の答えの1つを賛成投票してください。なぜなら、彼はここに入れないからです。


Getコマンドは、sed挿入された改行区切り文字の後のパターンスペースに予約済みスペースを追加します。\nしかし、ここでは予約されたスペースがまったく使われていないので、残りはewlineGだけです\n

extコマンドは、パターンスペースに挿入された改行区切り文字の後にext入力行をN追加します。各入力ラインに対してetとextを実行すると、各入力ラインに対して2つのewlineが生成されます。N\nGN\n

関連情報