2015-11-02 29 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的名字在每個文件

相關問題