2013-04-06 47 views
0

我剛剛開始在win7中使用powershell,以便爲程序mothur生成管道式腳本。之前我在ubuntu中使用bash腳本來做到這一點。我很高興現在一切都運作良好,除了一個任務:從文件中輸出選定的行作爲第一列,文件名稱作爲第二個coulmn

我想喜歡格式化FASTA文件的格式爲:

filename.fasta: 

>HXXC990 
AGTTCAAGGTCTCT 
>HXXC991 
GGGTTTCAAATCTC 
>HXXC992 
GGGTCTCTCCTATA 

爲一個文件,是製表符分隔,看起來像即

output.file: 

HXXC990 filename 
HXXC991 filename 
HXXC992 filename 

重要的是,輸出文件的第一列包含沒有「>」 - 符號的名稱。第二個由製表符分隔列原始文件名.fasta沒有後綴(「文件名」)。我有解決方案gci讀出文件的基本名稱和選擇字符串輸出所有以「>」開頭的行。唯一的問題仍然是在兩列中格式化和第二列中文件名稱的不斷重複。

我試過到目前爲止:

Select-String '>' .\filename.fasta | % {$_.Line} | set-content output.txt 

生產含有隻包含了「>」符號的行的文件。之後,我將其替換。文件名我已經

$base1 = gci filename.fasta | % {$_.BaseName} 
+0

所以我已經試過「選擇-string'>'。\ filename.fasta |%{$ _。Line} | set-content output.txt「生成一個僅包含」>「符號的行的文件。之後,我將其替換。我得到的文件名是$ base1 = gci filename.fasta | %{$ _。BaseName}。 – user2251977 2013-04-06 11:25:14

+0

我冒昧地用你的代碼片段更新你的問題。 – 2013-04-06 12:38:13

+0

當然。謝謝。那是我的錯,對不起!再次感謝!未來的帖子現在肯定會採用正確的格式。 – user2251977 2013-04-06 15:47:42

回答

0

得到試試這個:

select-string '^>' filename.fasta | % { 
    $_ -replace '^.*\\(.*?)\.fasta:\d+:>(.*)$', "`$2`t`$1" 
} > output.file 

請注意,你的正則表達式應該是^>,不只是>。後者將在任何地方匹配>

這可應用於多單文件是這樣的:

$recurse = $false 

Get-ChildItem "C:\base\folder" -Filter *.fasta -Recurse:$recurse ` 
    | select-string '^>' ` 
    | % { $_ -replace '^.*\\(.*?)\.fasta:\d+:>(.*)$', "`$2`t`$1" } > output.file 
+0

非常感謝!那正是我正在尋找的。我仍然必須習慣語法。我曾經使用awk進行這些操作。但在Windows環境中,使用PowerShell更優雅。再次感謝! – user2251977 2013-04-06 15:44:23

0

這裏的另一種解決方案,顯示了所涉及的操作有些不同的選項:

gci *.fasta | select-string '^>(.+)' | 
% {"{0}`t{1}" -f $_.matches.groups[1],$_.filename.split('.')[0]} | 
Set-Content output.file 
相關問題