我说3个不同的文件夹中有很多大文件,我想从中复制从同一个文件的X到Y的行,然后将它们附加到同名的新文件中。 我试着做了
ls seed1/* | while read FILE; do
head -n $Y | tail -n $X seed1/$FILE seed2/$FILE seed3/$FILE > combined/$FILE
done
这是$ FILE的第一个值的作业,但这不会返回提示,因此我无法执行此循环。
例如,我在三个不同的文件夹中有以下文件:seed1,seed2和seed3:
seed1/foo.dat
seed1/bar.dat
seed1/qax.dat
seed2/foo.dat
seed2/bar.dat
seed2/qax.dat
seed3/foo.dat
seed3/bar.dat
seed3/qax.dat
我想将所有文件中的10到20行合并到一个组合文件夹中:
combined/foo.dat
combined/bar.dat
combined/qax.dat
组合中的每个文件有30行,其中10个来自seed1,seed2和seed3。
答案 0 :(得分:2)
不需要循环:
awk -v x=10 -v y=20 '
FNR==1 { out = gensub(/.*\//,"combined/",1,FILENAME) }
FNR>=x { print > out }
FNR==y { nextfile }
' seed*/*.dat
以上假设"合并"在调用awk之前,目录已经存在(空或不存在),并使用GNU awk进行gensub()和nextfile以及内部文件管理。其他awks的解决方案效率较低,需要更多编码,并且当需要打开太多文件时,需要您管理关闭文件。