탭으로 구분된 파일의 여러 단어를 대체 단어로 바꾸기

탭으로 구분된 파일의 여러 단어를 대체 단어로 바꾸기

유기체를 나타내는 코드(예: ctc, nmg, nml)가 포함된 탭으로 구분된 파일이 있습니다(File_1).

522 ctc:CTC00972    -   506 3.20E-138   
522 nmg:Nmag_3027   -   561 4.70E-73
522 nml:Namu_3564   -   566 1.80E-146

또한 코드를 유기체 이름(File_2)에 연결하는 탭으로 구분된 파일도 있습니다.

ctc  Clostridium_tetani_E88
nla  Neisseria_lactamica
nmg  Natrialba_magadii

File_1의 코드를 File_2의 유기체 이름으로 어떻게 바꾸나요?

원하는 출력:

522 Clostridium_tetani_E88:CTC00972 -   506 3.20E-138   
522 Natrialba_magadii:Nmag_3027     -   561 4.70E-73
522 Neisseria_lactamica:Namu_3564   -   566 1.80E-146

전체 데이터 세트에는 이러한 코드가 수천 개 있으며 File_1과 File_2의 유기체 순서가 다르다는 점을 명심하세요.

답변1

이는 실제로 "한 파일에서 조회 테이블을 작성하여 다른 파일을 처리할 때 사용"의 변형일 뿐이며 조회 키가 두 번째 필드와 분리되어야 한다는 단점이 있습니다. awk예를 들어 다음과 같이 할 수 있습니다.

awk '
  BEGIN{OFS=FS="\t"} 
  NR==FNR {
    a[$1]=$2; next
  } 
  {
    split($2,b,":"); 
    if (b[1] in a) $2 = a[b[1]]":"b[2]
  } 1' File_2 File_1

답변2

이 작업을 수행해야 합니다 sed.

sed '/^[a-z]*[[:cntrl:]].*/{s/[[:cntrl:]]/###/;H;d;}
 G
 s/\([a-z]*\)\(:.*\n\)\1###\([^[:cntrl:]]*\)/\3\2/
 P
 d' file_2 file_1

이것은 입양이다이 일반적인 솔루션. 작동 방식에 대한 설명은 여기를 참조하세요.

답변3

방법:

awk 'NR==FNR{a[$1]=$2;next}$2 in a{$2=a[$2]":"$3;$3=""}1' File_2 FS="[ |:]" File_1

산출:

522 Clostridium_tetani_E88:CTC00972     -   506 3.20E-138   
522 Natrialba_magadii:Nmag_3027    -   561 4.70E-73
522 nml:Namu_3564   -   566 1.80E-146

두 입력 파일 간에 nml및 코드가 일치하지 않습니다 .nla

관련 정보