![使用find和sed将多个文件的第20行复制到一个文件中](https://linux22.com/image/62457/%E4%BD%BF%E7%94%A8find%E5%92%8Csed%E5%B0%86%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E7%AC%AC20%E8%A1%8C%E5%A4%8D%E5%88%B6%E5%88%B0%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD.png)
我有一个名为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
文件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
每个文件运行一个命令,效率会降低。