首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文件中的选定行输出为第一列,并将文件名输出为第二列

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

Stack Overflow用户
提问于 2013-04-06 18:59:45
回答 2查看 503关注 0票数 0

我最近刚刚开始在win7中使用powershell,以便为程序mothur生成类似于管道的脚本。在我使用ubuntu中的bash脚本来做这件事之前。我很高兴现在一切都很好,除了一项任务:

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

代码语言:javascript
复制
filename.fasta:

>HXXC990
AGTTCAAGGTCTCT
>HXXC991
GGGTTTCAAATCTC
>HXXC992
GGGTCTCTCCTATA

添加到以制表符分隔的文件,如下所示

代码语言:javascript
复制
output.file:

HXXC990    filename
HXXC991    filename
HXXC992    filename

输出文件的第一列必须包含不带">"-signs的名称,这一点很重要。第二个按制表符分隔的列是不带后缀的原始文件名(“filename.fasta”)。我让解决方案gci读出文件的基本名称,并使用Select-String输出所有以">“开头的行。唯一的问题仍然是两列中的格式和第二列中不断重复的文件名。

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

代码语言:javascript
复制
Select-String '>' .\filename.fasta | % {$_.Line} | set-content output.txt

生成一个只包含包含">“符号的行的文件。之后我就把它们换掉了。我得到的文件名是

代码语言:javascript
复制
$base1 = gci filename.fasta | % {$_.BaseName}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-06 20:31:44

试试这个:

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

请注意,您的正则表达式应该是^>,而不仅仅是>。后者可以在一行中的任何位置匹配>

这可以应用于多个文件,如下所示:

代码语言:javascript
复制
$recurse = $false

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

Stack Overflow用户

发布于 2013-04-06 23:44:31

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

代码语言:javascript
复制
gci *.fasta | select-string '^>(.+)' |
 % {"{0}`t{1}" -f $_.matches.groups[1],$_.filename.split('.')[0]} |
 Set-Content output.file
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15850047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档