我有几个包含文本的.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或类似的可能吗?谢谢 !!!
我有几个包含文本的.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或类似的可能吗?谢谢 !!!
如果可以是空文件,那么你需要:
与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
可以使用下面的命令:
awk 'FNR==1{print FILENAME}1' *.seq
FNR
是记录数(这是默认的行号)当前输入文件的。每次awk开始处理另一个文件FNR==1
,在这种情况下,当前文件名get的打印槽{print FILENAME}
。
尾随1
是awk的成语。它总是评估为真,这使得awk
打印所有的输入行。
注:
上述解决方案的工作,只要只因为你有一个文件夹中没有空文件。检查Ed Morton's great answer其中指出了这一点。
perl -lpe 'print $ARGV if $. == 1; close(ARGV) if eof' *.seq
$.
是行号
$ARGV
是当前文件
close(ARGV) if eof
的名字在每个文件
硬结束重置行数更短,并使用awk – NeronLeVelu
更高效只需要知道,如果有一个空文件,该文件会失败。对于OP:这是可能的吗?如果是这样,如果可能的话,最好使用GNU awks BEGINFILE而不是FNR == 1。 –
@ManuGórriz呃!我会期待你的EdMorten的回答。它的工作原理总是正确的,只有当文件夹中没有空文件时才适用 – hek2mgl