パイプなしで2つのコマンドを結合する(awkとsed)

パイプなしで2つのコマンドを結合する(awkとsed)

awkとsedを使用するコマンドがあります。

awk '{$1=""; print $0}' file.txt | sed "1s/.*/D,,3/" #awk command removes first column from file.txt and prints the rest, sed inserts "D,,3" on the first line

上記のコマンドで目的の結果を得ました。しかし、パイプの使用を避けたいのですが、上記の2つのコマンドを組み合わせてパイプを使用せずに同じ結果を得る方法はありますか?

first : awk '{$1=""; print $0}' file.txt
second: sed "1s/.*/D,,3/"

file.txt:
row 3:
name      john doe
state     Florida
age       32

ベストアンサー1

awkとsedはどちらもチューリング完了ですから、ある人ができることは何でも他の人もできます。 (テキスト変換に関する限り、awkはオペレーティングシステムとの対話のためのより多くの機能を提供します。)しかし、それぞれには独自の長所と短所があります。 awkはsedが実行するほとんどの操作を簡単に実行できますが、正規表現をグループ化するなど、一部の作業はより困難です。理論的には、sedはawkが行うことができるすべてのことを行うことができますが、かなりの問題があります(例えば、sedには整数演算機能がないため、テキスト変換を使用してエンコードする必要があります)。したがって、すべてを1つのコマンドに入れるには、通常、awkが最善の選択です。

awk 'NR==1 {print "D,,3"; next} {$1=""; print $0}' file.txt

ここで sed は awk で行った操作を簡単に実行できます。スペースを正規化し、すべてを最初のスペースに切り取ります。

sed "s/[ \t][ \t]*/ /g; s/^ *[^ ][^ ]*/ /; s/^ $//; 1s/.*/D,,3/" file.txt

ここでは、2つのコマンドを組み合わせることは特に有用ではありません。パフォーマンスの向上は期待していません。データがあるコマンドから次のコマンドに移動する必要があるため、各パイプラインにはパフォーマンスが低下します。ただし、パフォーマンスが向上する可能性があります。 CPU が複数ある場合は、2 つのコマンドを並列に実行できます。何かについてより専門的なコマンドを使用する場合(たとえば、awkなどの汎用ツールの代わりに同じ特殊ツールを使用する場合grep)、headゲインがパイプラインのオーバーヘッドを補償するかどうかによって一般的に高速です。データ、ツール、保有コア数などについて

このスクリプトがパフォーマンスのボトルネックでない限り、まず明確さを考慮してください。この場合、純粋なsedバージョンは使用しません。少し速いですが、読みにくくなります。 (たとえば、常に2つ以上のフィールドがあり、フィールド区切り文字が常に単一の空白であることを知っている場合、または空白の数を維持することを気にしない場合は、データに関する特定の前提に従って単純化することができます。)awkでは、きちんと行われますが、awk+sed バージョンと密接な関係があります。

おすすめ記事