我有一个像这样的文本文件:
MODIFIER|||c.72+1731G>T|SAMD11|protein_coding|CODING|NM_152486.2|2)
MODIFIER|||c.73-597G>A|SAMD11|protein_coding|CODING|NM_152486.2|2)
MODIFIER|||c.306-249T>C|SAMD11|protein_coding|CODING|NM_152486.2|4)
MODIFIER||2842||SAMD11|protein_coding|CODING|NM_152486.2|)
MODIFIER||4854||SAMD11|protein_coding|CODING|NM_152486.2|)
MODIFIER|||c.1443+808T>C|NOC2L|protein_coding|CODING|NM_015658.3|12)
LOW|||c.889C>G|NOC2L|protein_coding|CODING|NM_015658.3|8)
LOW|||c.889T>G|NOC2L|protein_coding|CODING|NM_015658.3|8)
MODIFIER||2687||KLHL17|protein_coding|CODING|NM_198317.2|)
MODIFIER||2885||NOC2L|protein_coding|CODING|NM_015658.3|)
我想提取像SAMD11、NOC2L和KLHL17这样的名字。
如果这些文件以正确的模式出现,我将使用tr将文件拆分为
tr '|' '\t'
及其之后将提取包含此名称信息的列。
帮帮忙吧。
谢谢。
发布于 2014-09-05 14:40:06
你可以用awk,
$ awk -F\| '{print $5}' file
SAMD11
SAMD11
SAMD11
SAMD11
NOC2L
NOC2L
NOC2L
KLHL17
NOC2L
如果要删除副本,然后将awk输出传递给sort -u
,
$ awk -F\| '{print $5}' file | sort -u
KLHL17
NOC2L
SAMD11
正如@jaypal所建议的,您可以使用下面的awk单行命令来删除副本。
awk -F\| '!seen[$5]++ && $0=$5' file
发布于 2014-09-05 14:44:38
使用标准裁剪命令提取字段
使用管道符号作为字段分隔符,并使用标准的剪切命令提取第五个字段。例如:
$ cut -d\| -f5 /tmp/corpus
SAMD11
SAMD11
SAMD11
SAMD11
SAMD11
NOC2L
NOC2L
NOC2L
KLHL17
NOC2L
发布于 2014-09-05 14:52:43
与Avinash Raj's awk solution一样,这可以用Perl实现,方法完全相同。您还可以包括相同的脱扣过程:
perl -F'\|' -lane'print $F[4] if !$seen{$F[4]}++;' yourfile.txt
!$seen{$F[4]}++
语句对%seen
哈希中的任何新键返回true。-a
开关是autosplit,-F
为其设置分隔符(以正则表达式的形式)。-l
处理print
的换行符,以及-n
将程序代码放入一个while (<>)
循环中,该循环将读取文件或标准输入。https://stackoverflow.com/questions/25688369
复制相似问题