ワイルドカード sed パスの使用方法

ワイルドカード sed パスの使用方法

私のパスには以下が含まれます。

/home/user/data/foo/test_foo.gz
/home/user/data/bar/test_bar.gz
/home/user/data/fub/test_fub.gz
and so on...

すべての.gzファイルの3行目を印刷しようとしています。

zcat /home/user/data/*/test_*.gz | sed -n '3p' > results

しかし、これは3行目だけを表示します。test_foo.gz

ベストアンサー1

sedはい、送信されるストリームがこれらのファイルの圧縮されていないコンテンツの組み合わせであることだけがわかるzcatためです。catgz

sedここでは、各ファイルに対して1つずつ実行する必要があります。

for file in /home/user/data/*/test_*.gz; do
  { zcat | sed '3!d;q'; } < "$file"
done > result

ここでは、3行目以降に終了するためにsed '3!d;q'forを使用するため、ファイル全体の解凍が完了する前に中断できます。sedzcat

{ a | b; } < file開くことができない場合は実行されないか、a両方が実行されていないことを確認してくださいbfileではa < file | b実行をaスキップしますが、ではスキップしますb。 In(ファイル自体を開くことができるコマンドa file | bの場合)は、ファイルを開くことができるかどうかに関係なく開始されます。aab

zgrep少なくともDebianでは、次のようにすることもできます。

GREP=sed zgrep '3!d;q' /home/user/data/*/test_*.gz

zgrep実際には引数に従って実行されるシェルスクリプトがあります(zcat -f | $GREPそのオプションを使用しない限り、ファイル名の前にusingを付けます。ただし、オプションがに渡されサポートされていないため、ここでwithを使用することは機能しません)。sed-h-hGREP=sed$GREPsed

おすすめ記事