我有一个类似以下示例的文本文件:
>chr1:368597-368634
ATGATATAATAAGCCCTTCTCATTAAACATGATATGG
>chr1:879533-879955
GGTTGCCGGGGGTAGGGGTGGGGCCACACAAATCTCCAGGAGCCACCACTCAACACAATGGCCCTGCCTCCCACCGCTTTATTTCTTTCGGTTTCGGATGCAAA
ACAAAAAATTTTAAAAGAAAATGTGACTTCAAAGGAAAGGAACAAATTTTCAAAGACTTGGGGGAGTGAAGGCAGAGCCTGGTGCAGATGGACGAGGTCTGCAG
GCCTGT
>chr1:879533-879955
GGTTGCCGGGGGTAGGGGTGGGGCCACACAAATCTCCAGGAGCCACCACTCAACACAATGGCCCTGCCTCCCACCGCTTTATTTCTTTCGGTTTCGGATGCAAA
GCCTGT
>chr1:879533-879639
GGTTGCCGGGGGTAGGGGTGGGGCCACACAAATCTCCAGGAGCCACCACTCAACACAATGGCCCTGCCTCCCACCGCTTTATTTCTTTCGGTTTCGGATGCAAA
AC
每组的第一行是以>
开头的ID
,下一行是一个字符序列。在第二行中,我想保留最后的29个,删除其余的。所以输出应该是这样的:
>chr1:368597-368634
ATAAGCCCTTCTCATTAAACATGATATGG
>chr1:879533-879955
GTGCAGATGGACGAGGTCTGCAGGCCTGT
>chr1:879533-879955
TTTCTTTCGGTTTCGGATGCAAAGCCTGT
>chr1:879533-879639
TTTATTTCTTTCGGTTTCGGATGCAAAAC
我如何使用awk
做到这一点呢?
发布于 2018-02-12 13:37:32
awk
解决方案:
awk 'r~/^>/{ print r ORS substr($0, length-28) }{ r=$0 }' a1
输出:
>chr1:368597-368634
ATAAGCCCTTCTCATTAAACATGATATGG
>chr1:879533-879955
GTGCAGATGGACGAGGTCTGCAGGCCTGT
>chr1:879533-879955
TTTCTTTCGGTTTCGGATGCAAAGCCTGT
>chr1:879533-879639
TTTATTTCTTTCGGTTTCGGATGCAAAAC
发布于 2018-02-12 13:36:13
awk '/^>/||$0=substr($0, length($0)-28)' file
上面的awk一行代码应该会对你有所帮助:
kent$ awk '/^>/||$0=substr($0, length($0)-28)' f
>chr1:368597-368634
ATAAGCCCTTCTCATTAAACATGATATGG
>chr1:879533-879955
GTGCAGATGGACGAGGTCTGCAGGCCTGT
>chr1:879533-879955
TTTCTTTCGGTTTCGGATGCAAAGCCTGT
>chr1:879533-879639
TTTATTTCTTTCGGTTTCGGATGCAAAAC
发布于 2018-02-12 13:43:04
另一个awk使用模块来决定是打印还是处理:
$ awk 'NR%2;!(NR%2){print substr($0,length()-28)}' file
>chr1:368597-368634
ATAAGCCCTTCTCATTAAACATGATATGG
>chr1:879533-879955
GTGCAGATGGACGAGGTCTGCAGGCCTGT
>chr1:879533-879955
TTTCTTTCGGTTTCGGATGCAAAGCCTGT
>chr1:879533-879639
TTTATTTCTTTCGGTTTCGGATGCAAAAC
https://stackoverflow.com/questions/48747689
复制相似问题