0

我最近才开始在 win7 中使用 powershell,以便为程序 mothur 生成类似管道的脚本。在我在 ubuntu 中使用 bash 脚本来执行此操作之前。我很高兴现在一切正常,除了一项任务:

我想格式化一个fasta文件,格式如下:

filename.fasta:

>HXXC990
AGTTCAAGGTCTCT
>HXXC991
GGGTTTCAAATCTC
>HXXC992
GGGTCTCTCCTATA

到一个制表符分隔的文件,看起来像这样

output.file:

HXXC990    filename
HXXC991    filename
HXXC992    filename

重要的是输出文件的第一列包含不带“>”符号的名称。第二个由制表符分隔的列是原始文件名.fasta,没有后缀(“文件名”)。我有解决方案 gci 来读出文件的基本名称和 Select-String 来输出所有以“>”开头的行。唯一的问题是两列中的格式和第二列中文件名的不断重复。

到目前为止我已经尝试过:

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

生成一个文件,该文件仅包含包含“>”符号的行。之后我只是更换了它们。我得到的文件名

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

2 回答 2

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
于 2013-04-06T12:31:43.540 回答
0

这是另一个解决方案,显示了所涉及操作的一些不同选项:

gci *.fasta | select-string '^>(.+)' |
 % {"{0}`t{1}" -f $_.matches.groups[1],$_.filename.split('.')[0]} |
 Set-Content output.file
于 2013-04-06T15:44:30.643 回答