csvgrep(csvkitの一部)を使用して、2つのファイルのいずれかに一致する行を抽出しようとしています。残念ながら、grepのように2つの一致するファイルを許可するコマンドラインオプションはありません。ただ、
csvgrep -f list1.txt -c 2 myfile.csv
コマンドの一部としてlist1.txtをlist2.txtに関連付ける方法はありますか?
csvgrep -f (list1.txt+list2.txt) -c 2 myfile.csv
私が考えることができる唯一の方法は一時的な中間ファイルを使用することですが、可能であればそうしない方が良いです。
答え1
読み込み時に、両方のファイルの内容を提供する「ファイル名」をコマンドで確認し、置換を処理し、目的のcat
内容を指定するとします。
csvgrep -f <(cat list1.txt list2.txt) -c 2 myfile.csv
デフォルトでは、プロセスの置き換えは、内部的にコマンドを実行し、その出力が通常のファイルのように開くことができるマジックファイルを介して提供されるように準備する汎用パイプです。拡張子自体はマジックファイルの名前に拡張されます。 (つまり、、printなどecho <(echo foo)
のものを印刷します。)/dev/fd/63
cat <(echo foo)
foo
答え2
多くのプログラムでは、-
標準入力または出力を表すファイル名として使用できます(入力ファイルか出力ファイルかによって異なります)。したがって、パイピングして試してcsvgrep
みることができます-f -
。
cat list1.txt list2.txt | csvgrep -f - -c 2 myfile.csv
機能する場合は、シェル固有の拡張に依存しないため、プロセスの交換方法に比べて利点があります。
それでも機能しない場合は使用できます/dev/stdin
。これは、プロセスの標準入力を自動的に参照する標準のLinuxデバイスです。
出力はパイプを介して送信されるため、これらのソリューションはすべてファイルルックアップをcsvgrep
必要としません。しかし、それは安全な家のように見えます。-f
cat