【问题标题】:extracting text blocks from input file with awk or sed and save each block in a separate output file使用 awk 或 sed 从输入文件中提取文本块并将每个块保存在单独的输出文件中
【发布时间】:2019-03-04 22:19:53
【问题描述】:

我正在尝试使用“awk”根据分隔符(# 和--)提取文本块(仅限第一个字段/列,但多行,行数因块而异)。这些列代表序列 ID。

使用“awk”我可以分隔块并打印第一列,但我无法将这些文本块重定向到单独的输出文件。

代码:

awk '/#/,/--/{print $1}' OTU_test.txt

理想情况下,我想根据在每个块的第一行中找到的一些文本(例如 MEMB.nem.6;MEMB.nem. 是内容,但数字会改变)保存每个文件(不包括分隔符的文本块) )

输入文件示例 enter image description here

#OTU_MEMB.nem.6
EF494252.1.2070 6750.0 D_0__Eukaryota;D_1__Opisthokonta;D_2__Nucletmycea;D_3__Fungi;D_7__Dothideomycetes;D_8__Capnodiales;D_9__uncultured fungus 1.000
FJ235519.1.1436 5957.0 D_0__Eukaryota;D_1__Opisthokonta;D_2__Nucletmycea;D_3__Fungi;D_7__Dothideomycetes;D_8__Capnodiales;D_9__uncultured fungus 1.000
New.ReferenceOTU9219 5418.0 D_0__Eukaryota;D_1__Opisthokonta;D_2__Nucletmycea;D_3__Fungi 1.000 
GQ120120.1.1635 471.0 D_0__Eukaryota;D_1__Opisthokonta;D_2__Nucletmycea;D_3__Fungi;D_7__Dothideomycetes;D_8__Capnodiales;D_9__uncultured fungus 0.990
--
#OTU_MEMB.nem.163
New.CleanUp.ReferenceOTU59580 12355.0 D_0__Eukaryota;D_1__Opisthokonta;D_2__Holozoa;D_3__Metazoa (Animalia);D_7__Chromadorea;D_8__Monhysterida 0.700
New.ReferenceOTU11809 1312.0 D_0__Eukaryota;D_1__Opisthokonta;D_2__Holozoa;D_3__Metazoa (Animalia);D_7__Chromadorea;D_8__Monhysterida 0.770
--
#OTU_MEMB.nem.35
New.CleanUp.ReferenceOTU120578 12116.0 D_0__Eukaryota;D_1__Opisthokonta;D_2__Holozoa;D_3__Metazoa (Animalia);D_7__Chromadorea;D_8__Desmoscolecida;D_9__Desmoscolex sp. DeCoSp2 0.780

预期的输出文件(仅第一列,无分隔符)。

MEMB.nem.6.txt

EF494252.1.2070 
FJ235519.1.1436 
New.ReferenceOTU9219 
GQ120120.1.1635

MEMB.nem.163.txt

New.CleanUp.ReferenceOTU59580
New.ReferenceOTU11809

MEMB.nem.35.txt

New.CleanUp.ReferenceOTU120578

我搜索了很多,但到目前为止我没有成功。如果有人可以建议我,我会很高兴。

谢谢,

蒂亚戈

【问题讨论】:

  • 您遇到了永远不应使用范围表达式的原因之一 (/start/,/end) - 最小的需求更改需要完全重写或复制条件。始终使用标志 (/start/{f=1} f; /end/{f=0})。

标签: bash awk


【解决方案1】:
awk '
sub(/^#OTU_/,"") {
    close(out)
    out = $0 ".txt"
    next
}
!/^--/ {
    print $1 > out
}
' file

【讨论】:

  • 亲爱的 Ed,感谢您的回答。我测试了脚本并且效果很好!唯一的事情是脚本在输出文件中添加了“MEMB.nem.6”;理想情况下,我希望每个块的第一列但跳过第一行(txt 中没有 MEMB.nem.6,只有:EF494252.1.2070 FJ235519.1.1436 New.ReferenceOTU9219 GQ120120.1.1635)。我现在正在研究这个,看看我是否能弄清楚。我相信我应该玩“打印 $1 > out”部分。再次感谢您的帮助!这是惊人的!此致,蒂亚戈
  • 只需在 out = $0 ".txt" 行之后添加一行 next。我更新了脚本以添加它。
  • 嗨,埃德,太棒了!刚刚尝试过并且工作得很好!再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 2016-06-03
  • 1970-01-01
相关资源
最近更新 更多