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