2013-07-25 25 views
0

我有一些转储文件,称为dump_mydump_0.cfg,dump_mydump_250.cfg,...,一直到dump_mydump_40000.cfg。对于每个转储文件,我想将第16行读出来,读取它们,并将它们放入一个文件中。将多个文件的第n行读取到一个输出中

我使用sed,但我遇到了一些语法错误。这是我到目前为止有:

for lineNo in 16 ; 
for fileNo in 0,40000 ; do 
    sed -n "${lineNo}{p;q;}" dump_mydump_file${lineNo}.cfg >> data.txt 
done 
+0

你害羞'do'的和'done'在您的片段。 – Rubens

+0

非常感谢!!!!!!!!!!!!!!!! – ilephant

+0

如果给出的答案正确地解决了您的问题,最好将其标记为答案;如果您想接受答案,请点击投票箭头下面的勾号。很高兴帮助! (: – Rubens

回答

1

考虑您的文件被命名为250间隔,你应该得到它的工作使用:

for lineNo in 16; do 
    for fileNo in {0..40000..250}; do 
     sed -n "${lineNo}{p;q;}" dump_mydump_file${fileNo}.cfg >> data.txt 
    done 
done 

注意两者在bash语法更正 - dodone,和{0..40000..250} - 和输入文件名称,应取决于${fileNo}而不是${lineNo}

+0

我想知道为什么一个人会在第一个位置循环16位数?为什么不用'lineNo = 16'并摆脱外部循环? – SethMMorton

1

可替代地,与(GNU)AWK:

awk "FNR==16{print;nextfile}" dump_mydump_{0..40000..250}.cfg > data.txt 

(I所用的文件名作为显示在OP相对于这将已经通过bash的生成循环的那些,如果校正工作。但你可以根据需要进行编辑。)

好处是你不需要for循环,而且你不需要产生160个进程。但这不是一个巨大的优势。

+0

问题已经解决了!但是,非常感谢! – ilephant

0

这可能为你工作(GNU SED):

sed -ns '16wdata.txt' dump_mydump_{0..40000..250}.cfg 
相关问题