2017-06-14 75 views
0

我在我的文件夾中有一堆TSV文件,並且對於其中一個人我希望獲得一個fasta文件,其中標誌'>'後面的標頭是文件的名稱。 我的TSV文件具有5列,而不頭:從tsv轉換爲fasta

因此:

inputfile中稱爲: 「A.coseq.table_headless.tsv」 HIV1B-pol-seed 15 MAX 1959 GTAACAGACTCACAATATGCATTAGGAATCATTCAAGC 輸出文件名爲 「A.fasta」

> A_MAX

GTAACAGACTCACAATATGCATTAGGAATCATTCAAGC

我想在bash同時運行該腳本的所有文件和我有這個腳本誰ð oes不工作,因爲在awk打印語句中我有一個大括號:

for sample in `ls *coseq.table_headless.tsv` 
do 
base1=$(basename $sample "coseq.table_headless.tsv") 
awk '{print ">"${base1}"_"$3"\n"$5}' ${base1}coseq.table_headless.tsv > ${base1}fasta 

done 

任何想法如何更正此代碼? 非常感謝

回答

2

如果basename是直到第一個「。」的部分,那麼您也可以擺脫循環。

awk '{split(FILENAME,base,"."); 
     print ">" base[1] "_" $3 "\n" $5 > base[1]".fasta"}' *coseq.table_headless.tsv 
+0

偉大它的作品!非常感謝你 –

+0

也許等一會兒再回答一個問題,https://stackoverflow.com/help/someone-answers – karakfa

0

另一個AWK溶液:

awk '{ pfx=substr(FILENAME,1,index(FILENAME,".")-1); 
     printf(">%s_%s\n%s\n",pfx,$3,$5) > pfx".fasta" }' *coseq.table_headless.tsv 

  • pfx包含文件名的第一部分(直到第一.
0

的其它解決方案公佈至今有幾個問題:

  1. 不關閉,因爲它們可以寫,除非你使用GNU awk將產生「太多 打開的文件」的錯誤的文件,

  2. 計算輸出文件名每次線是 閱讀,而不是當輸入文件是使用上輸出 redirectio的右側括號表達式打開是低效的,並且

  3. 一次n是未定義的行爲,所以只能在一些awk (包括GNU awk)中工作。

這將有力和有效地工作在所有awks:

awk ' 
    FNR==1 { close(out); f=FILENAME; sub(/\..*/,"",f); pfx=">"f"_"; out=f".fasta" } 
    { print pfx $3 ORS $5 > out } 
' *coseq.table_headless.tsv 
相關問題