Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于第一个唯一列值提取表_Python_Shell_Awk - Fatal编程技术网

Python 基于第一个唯一列值提取表

Python 基于第一个唯一列值提取表,python,shell,awk,Python,Shell,Awk,我有一个表格格式的大文件(2GB),需要根据第二列的第一个值进行grep Ref1 xzxzxzz00000135960.1 51.74 259 125 0 1 259 125 383 3e-85 269 Ref1 xzxzxzz00000126626.2 50.20 249 124 0 11 259 2 250 8e-79 248 Ref1 xzxzxzz00000137335.1 49.81 259 130 0 1

我有一个表格格式的大文件(2GB),需要根据第二列的第一个值进行grep

Ref1    xzxzxzz00000135960.1    51.74   259 125 0   1   259 125 383 3e-85   269
Ref1    xzxzxzz00000126626.2    50.20   249 124 0   11  259 2   250 8e-79   248
Ref1    xzxzxzz00000137335.1    49.81   259 130 0   1   259 125 383 1e-78   252
Ref1    ASNP00000445420.1   49.42   259 131 0   1   259 125 383 3e-78   251
Ref1    xzxzxzz00000126626.2    52.20   349 124 0   11  259 2   250 8e-79   248
Ref1    ASNP00000445420.1   49.80   255 128 0   1   255 125 379 2e-77   249
Ref1    ASNPCAP00000013746.1    47.88   259 135 0   1   259 106 364 1e-76   243
Ref2    xzxzxzz00000108341.3    26.38   163 87  8   11  140 156 318 5e-04   43.9
Ref2    ASNP00000026303.9   26.38   163 87  8   11  140 149 311 5e-04   43.9
Ref2   xzxzxzz00000108321.3    16.38   163 87  8   11  140 156 318 5e-04   43.9
Ref2    ASNP00000108340.1   26.38   163 87  8   11  140 149 311 5e-04   43.9
Ref2    ENSLAFP00000015342.3    25.45   165 86  9   11  140 150 312 0.002   41.6
我需要从第二列中得到第一个唯一的字母表,与第一列值的预期输出类似

Ref1    xzxzxzz00000135960.1    51.74   259 125 0   1   259 125 383 3e-85   269
Ref1    ASNP00000445420.1   49.42   259 131 0   1   259 125 383 3e-78   251
Ref1    ASNPCAP00000013746.1    47.88   259 135 0   1   259 106 364 1e-76   243
Ref2    xzxzxzz00000108341.3    26.38   163 87  8   11  140 156 318 5e-04   43.9
Ref2    ASNP00000026303.9   26.38   163 87  8   11  140 149 311 5e-04   43.9
Ref2    ENSLAFP00000015342.3    25.45   165 86  9   11  140 150 312 0.002   41.6

我尝试使用R,但由于大小(可能是系统配置)的原因失败。python或AWK有什么建议吗?

请尝试以下内容。我相信这应该会更快,尽管我还没有用大量数据进行测试

awk '
{
  val=$2
  gsub(/[^a-zA-Z]+/,"",val)
}
!a[$1,val]++{
  value=(value?value ORS:"")$0
}
END{
  print value
}
' Input_file
输出如下

Ref1    xzxzxzz00000135960.1    51.74   259 125 0   1   259 125 383 3e-85   269
Ref1    ASNP00000445420.1   49.42   259 131 0   1   259 125 383 3e-78   251
Ref1    ASNPCAP00000013746.1    47.88   259 135 0   1   259 106 364 1e-76   243
Ref2    xzxzxzz00000108341.3    26.38   163 87  8   11  140 156 318 5e-04   43.9
Ref2    ASNP00000026303.9   26.38   163 87  8   11  140 149 311 5e-04   43.9
Ref2    ENSLAFP00000015342.3    25.45   165 86  9   11  140 150 312 0.002   41.6

Python版本,使用
re
模块和
itertools.groupby

如果您的问题输入了
data.txt
,则此脚本:

import re
from itertools import groupby

with open('data.txt', 'r') as f_in:
    for v, g in groupby(f_in, lambda k: k.split()[0]):
        seen = set()
        for line in g:
            alpha = re.findall(r'^[a-zA-Z]+', line.split()[1])[0]
            if alpha not in seen:
                seen.add(alpha)
                print(line.strip())
产生:

Ref1    xzxzxzz00000135960.1    51.74   259 125 0   1   259 125 383 3e-85   269
Ref1    ASNP00000445420.1   49.42   259 131 0   1   259 125 383 3e-78   251
Ref1    ASNPCAP00000013746.1    47.88   259 135 0   1   259 106 364 1e-76   243
Ref2    xzxzxzz00000108341.3    26.38   163 87  8   11  140 156 318 5e-04   43.9
Ref2    ASNP00000026303.9   26.38   163 87  8   11  140 149 311 5e-04   43.9
Ref2    ENSLAFP00000015342.3    25.45   165 86  9   11  140 150 312 0.002   41.6

因此,我们鼓励人们在他们的帖子中添加他们的努力,所以请添加同样的努力,然后让我们知道。我尝试使用awk命令'FNR==1{print;next}!a[substr($2,1,6)]++'但它失败了。好的,请在你的帖子中添加该代码。你能解释一下获得预期产出的逻辑吗?就像为什么
xzxzxzz00000126626.2
不在输出中,至少它的1个条目应该在那里,对吗?想法是从第二列中获取第一个唯一字母,关于第一列值,请描述清楚关系,因为不清楚您到底想要什么