Awk 将多个文件的X到Y的cat行合并到一个文件中

Awk 将多个文件的X到Y的cat行合并到一个文件中,awk,sed,cat,tail,head,Awk,Sed,Cat,Tail,Head,我有很多巨大的文件,比如说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

我有很多巨大的文件,比如说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

不需要循环:

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以及内部文件管理。使用其他AWK的解决方案效率较低,需要更多的编码,并且需要在打开太多文件时管理关闭文件。

无需循环:

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以及内部文件管理。使用其他AWK的解决方案效率较低,需要更多的编码,并且需要在打开太多文件时管理关闭的文件。

对不起,我的问题不清楚。。你能编辑你的答案以适应这个问题吗(我已经编辑过了)?编辑你的问题以澄清你想做什么,因为我们无法从一个不做你想做的事情的脚本中分辨出你真正想做的事情(很明显,因为我们已经尝试过了,而且显然猜错了)。包括简洁、可测试的样本输入和预期输出;dob=${f#seed1/};awk-v x=“$x”-v y=“$y””FNR>=x;FNR==y{nextfile}'f“seed2/$b”seed3/$b“>“combined/$b”;完成对不起,我的问题不清楚。。你能编辑你的答案以适应这个问题吗(我已经编辑过了)?编辑你的问题以澄清你想做什么,因为我们无法从一个不做你想做的事情的脚本中分辨出你真正想做的事情(很明显,因为我们已经尝试过了,而且显然猜错了)。包括简洁、可测试的样本输入和预期输出;dob=${f#seed1/};awk-v x=“$x”-v y=“$y””FNR>=x;FNR==y{nextfile}'f“seed2/$b”seed3/$b“>“combined/$b”;完成提示消失,因为您没有给“head”一个文件参数。使用ls生成文件,然后覆盖文件看起来也很可疑。提示消失,因为您没有给“head”一个文件参数。使用ls生成文件,然后覆盖文件看起来也很可疑。