findとsedを使用して複数のファイルの20行目を1つにコピーする

findとsedを使用して複数のファイルの20行目を1つにコピーする

というファイルがありますPKA1

このフォルダには、次の名前の複数のフォルダがあります。

1eV2eV…。30eV

各サブフォルダには次のファイルがあります。PKA.dump

PKA.dump各サブフォルダの20行を名前付きフォルダにコピーしたいと思いますdata.txt

findコマンドを使用してすべてのファイルを見つけることができることを知っていますPKA.dump

find . -type f -name PKA.dump

私も自分で書くことができることを知っていますsed

sed -i '20q;d' PKA.dump > data.txt

ただし、すべてのファイルを繰り返し使用する場合は、sed次のようになります。

find . -type f -name PKA.dump | sed -i '20q;d' PKA.dump > data.txt

次のエラーが発生します。

sed: can't read PKA.dump: No such file or directory

助けが必要ですか?PKA.dumpファイル1eVなど2eVの20行を順番に名前付き3eVファイルに入れたいと思いますdata.txt

答え1

find . -name PKA.dump -type f -exec awk '
   FNR == 20 {print; nextfile}' {} +

nextfile、利用可能な場合(GNU awkとFreeBSDと最新mawkバージョンまもなく標準に追加される予定)次のファイルに移動します。それ以外の場合は無視されます(変数の逆参照と同様nextfile)。それでも動作しますが、ファイル全体を読みます。

それでも次のことができます。

find . -name PKA.dump -type f -exec sed '20q;d' {} \;

ただし、これはsedファイルごとに1つのコマンドを実行することを意味し、効率が悪くなります。

関連情報