2017-09-13 6 views
0

ファイルのcat出力をsedパターンにpiplineしたいと思います。 color.txtとduplicate.txtという2つのファイルがあるとします。 color.txtには青、緑、赤の3色があり、duplicate.txtには緑が含まれています。 sedを使用して、color.txtファイルから緑色を削除します。catをsedパターンにパイプラインする方法

私はこのような何かを試してみてください。

cat duplicate.txt | sed "/$/d" < color.txt 

残念ながら、それは動作しません。どのようにこれを行うための任意の提案?私はあなたがこの意味を考える

+1

* nix utilsは一般的にファイルに対して動作し、このようにcatを使用することは広く["UUOC](http://porkmail.org/era/unix/award.html)"とみなされます... "無駄な猫の使用 "。答え(これまでのところ)に見られるように、彼らは一般的に 'cat'を使用しません。 –

答えて

0

:あなたはコメントから伝えることができるよう

sed "/$(cat duplicate.txt)/d" color.txt 

はしかし、このアプローチは非常にお勧めできません。他のソリューションの1つを使用することをお勧めします。私はあなたが学びたかったテクニックを示しているので、私はこの答えを削除しません。

+2

duplicate.txtに複数の行がある場合、これは構文エラーを生じませんか?また、部分的に一致する行も削除されます。それがOPが望んでいるかどうかは分かりません。 – codeforester

+0

@codeforesterはい、私は与えられた例と、それが* "duplicates" *と呼ばれ、* "duplicates" *と呼ばれているという事実のために、ただ一つの行があったということを意味しました。そのロジックによって推測されますが、* "colors.txt" *でなければなりません:-) –

+0

部分一致は単語境界を追加することによって克服することができますが、再びOPはその点で特有ではありません。私はOPが尋ねてきたテクニック、すなわちファイルの内容を 'sed'のパターンとしてどのように使うかを実証しようとしていました。私は、あなたのソリューションが技術的により正確であることに同意します。私の目標は、OPが達成しようとしている概念に近づいています。私はあなたのために投票します –

2

あなたが望むものを達成するためにgrepを使用することができます。

grep -Fxvf duplicate.txt color.txt 
  • -F color.txt
  • で全体のラインを一致させるために、文字列ではなく、パターン
  • -xとしてduplicate.txtにラインを処理するために
  • -v一致しない行を抽出するには
  • -f duplicate.txtからcolor.txtとの一致

これは、ファイルのパターン数に関係なく機能します。この場合にはgrepソリューションは、時々私は、このようなコマンドを使用し、十分ですが

2

:非常に大きなファイルについては、この記事を見てしたい場合があります:ここでは

sed 's|.*|/^\1$/d|' duplicate.txt | sed -i -f - color.txt

最初sed呼び出し変換それぞれの行をduplicate.txtから適切なsedコマンドにコピーして、必要なものを正確に削除します。これによりsedスクリプトが生成され、その後に-f -を使用して渡されます。ここで、-というファイル名は標準入力を意味します。

関連する問題