【发布时间】:2017-11-20 15:32:41
【问题描述】:
对于下面的文件,我想提取“XC:Z:”和“XM:Z:”后面的两个字符串。例如:
- 第一行输出应该是这样的:“TGGTCGGCGCGT, GAGTCCGT”
- 第二行输出应该是这样的:“GAAGCCGCTTCC, ACCGACGG”
该文件的原始版本比以下示例多几列和几百万行,但它应该给你的想法:
MOUSE_10 XC:Z:TGGTCGGCGCGT RG:Z:A XM:Z:GAGTCCGT ZP:i:33
MOUSE_10 XC:Z:GAAGCCGCTTCC NM:i:0 XM:Z:ACCGACGG AS:i:16
MOUSE_10 ZP:i:36 XC:Z:TCCCCGGGTACA NM:i:0 XM:Z:GGGACGGG ZP:i:28
MOUSE_10 XC:Z:CAAATTTGGAAA RG:Z:A NM:i:1 XM:Z:GCAGATAG
此外,以下每个标准都是奖励,但如果您能使其发挥作用,则不是强制性的:
- 使用标准 bash 工具:awk、sed、grep 等(无 GAWK、csvtools...)
- 假设我们不知道 XC 和 XM 出现的顺序(虽然我相当肯定 XC 几乎是第一个,但我不确定如何检查)。然而,在输出中,如果可能的话,XC 字符串应该总是在 XM 字符串之前。
awk extract multiple groups from each line 这里的答案非常接近它,但是每当我尝试使用 match(...) 时,我都会收到“意外令牌附近的语法错误”消息。
期待您的解决方案!
谢谢,
菲利克斯
【问题讨论】:
-
轻松使用
GAWK -
您应该显示出现错误的代码——我们可能很容易解决这个问题。
-
你会在一行中获得 3 批
XC:Z:和 2 批XM:Z:吗?你能有一种模式而没有另一种吗?所需的输出究竟是什么——应该保留前缀吗?即使在单个输入行中有 2 个或更多匹配项,您是否希望输出中的每个模式都有一行,因此输出中的总行数可能大于输入中的行数。这并不难;这只是一个确定你想要做什么的问题。生成带有示例输出数据的 MCVE (minimal reproducible example) 也有帮助(显示的输入很好)。 -
@JonathanLeffler 我希望每行每个字符串(XC:Z: 和 XM:Z:) 恰好出现一次,感谢您提出的澄清问题。我同意在提供的两个示例之上的完整输出将更接近真实的 MCVE,抱歉没有添加它!
-
为什么不现在添加呢? wrt 您的语法错误 - 您正在运行旧的、损坏的 awk,或者您正在从命令行调用 awk,而 bash 正在解释
!。如果不了解更多关于您的环境、您正在执行的内容以及您的预期输出等信息,我们将无法为您提供太多帮助。