【问题标题】:awk, grep, sed to extract string based on location in a tab delimited fileawk、grep、sed 根据制表符分隔文件中的位置提取字符串
【发布时间】:2015-09-11 03:48:45
【问题描述】:

我有一个超过 800 万行和 8 列的制表符分隔文件;像这样:

contig17_11 T   C   0.05    TACTACTTGTGGACGAT   TTTTGGCACCCTACGATTAATT  TTTTT   CNCCN
contig10_97 G   A   0.05    GCTCCTGTCGGAAAATAACCCGA GGGGTGTTGATTGTTTTCTT    GGGGG   NNANA
contig10_10 G   A   0.05    GCAAGAGATAGAGCATCGCTC   GGATCCCCAGGACCTGAGAC    GGGGG   AAAAN

我需要在第 7 列提取第 4 个字符(DNA 碱基)为 A 或 C 或 G 或 T 的行,在第 8 列第 4 个字符为“N”。第 7 列和第 8 列的长度均为 5 个字母。我尝试了基本的 awk grep 命令来执行此操作,但没有结果。我试过猫输入文件| awk '$8 ~ /N/' >outfile 练习,有点不是我要找的。​​p>

【问题讨论】:

  • 能否将示例数据的格式更清晰一些,让换行符很明显?
  • 我不知道怎么做,谢谢 Fredrik

标签: awk sed grep


【解决方案1】:

这能解决您的问题吗?

$ awk '/...[ACGT].\t...N.$/' input.txt
contig10_97 G   A   0.05    GCTCCTGTCGGAAAATAACCCGA GGGGTGTTGATTGTTTTCTT    GGGGG   NNANA

使用 sed 应用相同的技术:

$ sed -n '/...[ACGT].\t...N.$/p' input.txt
contig10_97 G   A   0.05    GCTCCTGTCGGAAAATAACCCGA GGGGTGTTGATTGTTTTCTT    GGGGG   NNANA

最后是 grep:

$ grep -o '^.*...[ACGT].        ...N.$' input.txt
contig10_97 G   A   0.05    GCTCCTGTCGGAAAATAACCCGA GGGGTGTTGATTGTTTTCTT    GGGGG   NNANA

这里的制表符是在命令行中使用ctrl-v tab 插入的。

或使用 P 开关进行 grep 启用 PCRE(Perl 正则表达式):

$ grep -oP '^.*...[ACGT].\t...N.$' input.txt
contig10_97 G   A   0.05    GCTCCTGTCGGAAAATAACCCGA GGGGTGTTGATTGTTTTCTT    GGGGG   NNANA

【讨论】:

  • 对不起,我的样本没有显示,但第 7 列不只是 ACGT,它也有 N。所以它可能是 NNNNN,或 ANNNN 或 GTNAA,基本上两者都可能有 5^5 种不同的组合第 7 列和第 8 列。
  • 如果我理解正确,您需要做的就是改用awk '/...[ACGTN].\t...N.$/'。如果这不正确,那么我建议您使用显示输入和预期输出的示例来更新您的问题。
  • Fredrik,我遇到了更多问题,在某些情况下,数据文件有一个额外的列,列。
  • Basically, some rows have 8 columns, some 9 and some 10. Like this: contig1493_44 T C 0.05 TGAGTACATCGGTCATAACATTAAAACCACTC CCTCTTCAATTTAAACAGCTGTTTGTGTAAAAGT ACTCN NCNNN contig1493111_424 T C A 0.05 TGAGTACATCGGTCATAACATTAAAACCACTAAC CCTCTTCAATTTAAACAGCTGTTTGTGTAAAACC GGGNA NCNNN contig1493111_424 T C A G 0.05 TGAGTACATCGGTCATAACATTAAAACCACTAC CCTCTTCAATTTAAACAGCTGTTTGTGTAAAAG TAATG NCNNN
  • 发布一个新问题,我们很乐意再次为您提供帮助!肯特的回答也很好,无论列的总数如何,它都可以工作
【解决方案2】:

给定的示例只有 7 列。 无论如何,你可以用 awk 做到这一点。 awk 有substr 功能。

awk -F'\t' 'substr($7,4,1)~/[ACGT]/ && substr($8,4,1)=="N"' file

one-liner 未经测试,但非常简单,几乎逐字翻译您的要求。

【讨论】:

  • 无需使用-F'\t',示例有8列:-)
【解决方案3】:

为了完整性,在 sed 中:

sed -n -e "s/.*\t...[AGCT].\t...N.$/\0/p" dna.txt

【讨论】:

    猜你喜欢
    • 2021-06-19
    • 2013-03-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多