input.txt
我在名为 的一百个子文件夹中的每个子文件夹中都有文本文件sample_1, ..., sample_100
。
input.txt
我可以使用以下命令提取所有文件的第一行:
find -name input.txt -exec awk 'FNR == 1 {print $0}' > out.txt {} \;
但这会将所有内容的第一行打印input.txt
到当前目录中的一个out.txt
文件中。
我想要的是在每个子文件夹中,该特定子文件夹中out.txt
的第一行。input.txt
例如,out.txt
内部sample_57
子文件夹的第一行为input.txt
in sample_57
。
关于如何完成这件事的任何想法。
答案1
使用head
而不是awk
.另外,使用-execdir
而不是-exec
使要执行的命令更易于阅读。
find -type f -name input.txt -execdir sh -c 'head -1 input.txt > out.txt' \;
答案2
out.txt
在每个子文件夹中,第一行为input.txt
该特定子文件夹中的
find
+sed
解决方案:
find . -type f -name input.txt -exec sh -c 'out_fn="${1%/*}/out.txt"; sed -n "1p" "{}" > "$out_fn"' _ {} \;
out_fn="${1%/*}/out.txt"
- 路径输出文件名格式上/path/to/subfolder/out.txt
sed -n "1p" "{}"
- 从输入文件中提取第一行{}
答案3
做就是了
find . -type f -name "input.txt" -execdir awk 'NR==1{print $0>"out.txt"}' '{}' +
或者您可以使用exit
处理程序,它会在打印第一行后退出,并且当您只想打印第一行而不需要awk
处理整个文件直到文件末尾时更好。
find . -type f -execdir awk '{print $0>"out.txt";exit}' '{}' +