テキストファイルから特定の行と特定の文字列を含む複数行を抽出する方法は?

テキストファイルから特定の行と特定の文字列を含む複数行を抽出する方法は?

必要以上のデータを含むテキストファイルのコレクションがあります。各ファイルの最初の行にカンマ区切り文字列は次のとおりです。

stop_id,stop_code,stop_name,stop_desc,stop_lat,stop_lon,location_type,parent_station,zone_id

その後、そのキーの下にすべてのデータがあります。このデータのサブセットを新しいテキストファイルに抽出する必要がある場合は、そのサブセットを使用できます(すべてのデータは必要なく、多すぎます)。

このコマンドを使用して最初の行を抽出します。

sed -n '1p' source.txt > destination.txt

また、このコマンドを使用して必要な特定の行を抽出します。

grep "string" source.txt > destination.txt

問題は、同じスクリプトで両方のコマンドを実行すると(ほぼそのまま、行または区切り&&grep、出力がsed出力を上書きすることです。 2つを順番に実行し、2つの組み合わせ出力を取得するにはどうすればよいですか?

grep私はより複雑なコマンドを使用して1行を検索し、次に一連の行を見つけることに関して同様の問題を見つけました。データを抽出する必要がある各ファイルの最初の行が異なるため、ここでは機能しません。

理想的には、作業する必要がある各ファイルに対して実行できる関数を作成したいのですが、まずコマンドをリンクして出力を結合する必要があります。

答え1

sedこれにより、両方の操作が実行されます(最初の行と含まれているすべての行を印刷string)。

sed -n '1p; /string/p' source.txt > destination.txt

またはより長いバージョン:

sed -n -e '1p' -e '/string/p' source.txt > destination.txt

答え2

grep出力を追加するように変更するだけです。

grep "string" source.txt >> destination.txt

答え3

これを行う方法はいくつかあります。単一のコマンドを使用して、次の2つの行を取得できます。@Cyrusのsedソリューションはまさにそうします。。これを実行できる他のツールは次のとおりです。

awk 'NR==1 || /string/' source.txt > destination.txt
perl -ne 'print if /string/ || $. ==1' source.txt > destination.txt

もちろん、実行中の2つのコマンドを実行し、2番目のコマンドを変更してファイルに追加することもできます。バンジョサが提案したとおり。または、サブシェルで2つのコマンドをグループ化し、サブシェルの出力をファイルにリダイレクトすることもできます。

(sed -n '1p' file; grep string file) source.txt > destination.txt

または

{ sed -n '1p' file; grep string file; } source.txt > destination.txt

したがって、必要な機能がそれらから関数を生成することであれば、それをシェルの初期化ファイル(たとえば~/.bashrc)に追加するのと同じくらい簡単です。

foo(){ sed -n '1p' file; grep string file; } 

これで関数を実行しfooて目的のタスクを実行できるようになりました。

foo source.txt > destination.txt

関連情報