2013-06-07 2 views
1

일반적으로 R을 사용하고 merge.by를 사용하지만이 파일은 부서의 컴퓨터 중 너무 큰 것 같습니다 이걸 처리해야 해! (유전학 분야에서 일하는 사람을위한 추가 정보) 본질적으로, 대체 (imputation)는 snp ID의 rs 번호를 제거하는 것으로 보이며, Chromosome : Position 정보를 그대로두고 있습니다. 그래서 내가 원하는 모든 rs 번호를 가진 링키지 파일을 만들었고 파일 1의 Chr : Pos 열을 파일 2의 rs 수로 대체하려고합니다.파일 1의 열 A가 파일 2의 열 A 인 경우 파일 2의 열 B로 대체하십시오.

그래서 코드 작성 방법을 생각하려고했습니다 :

파일 2

1 rs58108140 0 10583  1:10583 
1 rs192319073 0 105830003 1:105830003 
1 rs190151039 0 10583005 1:10583005 
1 rs2809302 0 105830229 1:105830229 
1 rs191085550 0 105830291 1:105830291 

원하는 출력과 같은

1111 1111 1:10583 G G 
1112 1112 1:10583 G G 
1113 1113 1:10583 G G 
1114 1114 1:10583 G G 
1115 1115 1:10583 G G 

처럼
If $3 of file 1 = $5 of file 2, replace $3 file 1 with $2 of file 2. 

파일 1은 보이는 것 수 :

1111 1111 rs58108140 G G 
1112 1112 rs58108140 G G 
1113 1113 rs58108140 G G 
1114 1114 rs58108140 G G 
1115 1115 rs58108140 G G 
+0

큰 파일 2의 크기는 어떻게 될 수 있습니까? 열 5와 2에서'dict'을 만들 수 있습니까? – oleg

+0

각 파일의 크기는 어느 정도입니까? –

+1

파일 1의 3 열이 파일 2의 열 5와 같은 순서로 그룹에 나타나면 awk를 사용하고 file1에서 새 그룹을 만날 때마다 file2의 getline을 수행하십시오. Cant '가 지금 세부 정보를 제공하고 실행해야합니다. sudo_o가 세부 정보를 제공 할 수 있습니다. –

답변

2

간단한에서 사전을 만들 :

$ awk 'FNR==NR{a[$5]=$2;next}$3 in a{$3=a[$3]}1' file2 file1 
1111 1111 rs58108140 G G 
1112 1112 rs58108140 G G 
1113 1113 rs58108140 G G 
1114 1114 rs58108140 G G 
1115 1115 rs58108140 G G 
+1

불행히도이 파일은 메모리에 저장하기에는 너무 크기 때문에 불만 사항이 있습니다 ... –

+0

나는 그 파일이 .. 큰 파일 인 것 같지 않았습니다. 그것을 위해 팔지 마라. –

+1

내 컴퓨터가 여기까지 늘어나고 작동했습니다. 당신의 도움을 주셔서 대단히 감사합니다. –

0

awk와 파일 2

with open('file2', 'r') as file2: 
    replacement = {} 
    for line in file2: 
     splited_line = line.split() 
     replacement[splited_line[4]] = splited_line[1] 

with open('file1', 'r') as file1: 
    with open('file1_new', 'w') as file1_new: 
     for line in file1: 
      splitted_line = line.split() 
      splitted_line[2] = replacement.get(splitted_line[1], splitted_line[1]) 
      file1_new.write(' '.join(splitted_line)+'\n') 
0

joinawk이 할 수 있습니다. awk 대신 cut을 사용할 수도 있지만 나중에 다른 방식으로 필드의 순서를 조정해야합니다.

join -1 3 -2 5 file1 file2 | awk '{print $2, $3, $7, $4, $5}' 

경고 : sudo_O에서 언급 한 바와 같이,이 파일이 분류되어있는 경우에만 작동합니다 - 나는 주어진 예에 따라, 그들이 믿고있어. 그들이 그렇지 않다면, 이것은 매우 빠르지 않을 것입니다. 이미 정렬 된 경우 두 명령 모두 읽는 동안 데이터를 처리하기 때문에 메모리에 읽을 필요가 없습니다.

+0

가입하려면 파일을 정렬해야합니다. 2 개의 대용량 파일을 정렬하지 않고 결합한 다음 awk를 통해 실행합니다. –

+0

어쩌면 나는 너무 많이 추측하고 있지만, 예제에서 정렬되어있는 것처럼 보입니다. – viraptor

+0

'file2'는 정렬되지 않았습니다.'diff file2 <(sort file2) ' –

관련 문제