2015-11-02 31 views
1

我有几个包含文本的.seq文件。 我想包含一个文本文件:使用名称和其他内容创建一个新的文本文件

name_of_the_seq_file1 
contents of file 1 
name_of_the_seq_file2 
contents of file 1 
name_of_the_seq_file3 
contents of file 3 

...

所有文件都放在同一目录下。 awk或类似的可能吗?谢谢 !!!

回答

2

如果可以是空文件,那么你需要:

与GNU AWK:

awk 'BEGINFILE{print FILENAME}1' *.seq 

与其他awks(未经测试):

awk ' 
FNR==1 { 
    for (++ARGIND;ARGV[ARGIND]!=FILENAME;ARGIND++) { 
     print ARGV[ARGIND] 
    } 
    print FILENAME 
} 
{ print } 
END { 
    for (++ARGIND;ARGIND in ARGV;ARGIND++) { 
     print ARGV[ARGIND] 
    } 
}' *.seq 
2

可以使用下面的命令:

awk 'FNR==1{print FILENAME}1' *.seq 

FNR是记录数(这是默认的行号)当前输入文件的。每次awk开始处理另一个文件FNR==1,在这种情况下,当前文件名get的打印槽{print FILENAME}

尾随1是awk的成语。它总是评估为真,这使得awk打印所有的输入行。

注:

上述解决方案的工作,只要只因为你有一个文件夹中没有空文件。检查Ed Morton's great answer其中指出了这一点。

+0

硬结束重置行数更短,并使用awk – NeronLeVelu

+1

更高效只需要知道,如果有一个空文件,该文件会失败。对于OP:这是可能的吗?如果是这样,如果可能的话,最好使用GNU awks BEGINFILE而不是FNR == 1。 –

+0

@ManuGórriz呃!我会期待你的EdMorten的回答。它的工作原理总是正确的,只有当文件夹中没有空文件时才适用 – hek2mgl

0

perl -lpe 'print $ARGV if $. == 1; close(ARGV) if eof' *.seq

$.是行号
$ARGV是当前文件
close(ARGV) if eof的名字在每个文件

相关问题