我有幾個包含文本的.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