使用find和sed将多个文件的第20行复制到一个文件中

使用find和sed将多个文件的第20行复制到一个文件中

我有一个名为PKA1

在此文件夹中,我有几个文件夹,名为:

1eV, 2eV....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文件1eV2eV等中的第 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每个文件运行一个命令,效率会降低。

相关内容