输出文件中的选定行作为第一列,将文件名作为第二列输出

时间:2013-04-06 10:59:45

标签: powershell text-files data-conversion mothur

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

我想要格式化一个表格形式的fasta文件:

filename.fasta:

>HXXC990
AGTTCAAGGTCTCT
>HXXC991
GGGTTTCAAATCTC
>HXXC992
GGGTCTCTCCTATA

以制表符分隔并且看起来像

的文件
output.file:

HXXC990    filename
HXXC991    filename
HXXC992    filename

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

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

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

生成一个只包含“>”行的文件迹象。后来我换了他们。

我得到的文件名
$base1 = gci filename.fasta | % {$_.BaseName}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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