열 중복을 기준으로 행별로 테이블을 조인합니다.

열 중복을 기준으로 행별로 테이블을 조인합니다.

먼저 각 파일의 열 3, 5, 7을 일치시키고 file1의 줄을 file2의 해당 줄 옆에 배치하여 file1을 file2와 정렬하고 싶습니다.

이것은 둘 사이의 중첩을 유지해야 하는 코드이지만 file2를 file1에 추가하고 싶습니다. 도움을 주시면 감사하겠습니다!

awk 'NR==FNR {a[$3$5$7];next}($3$5$7 in a){print $0}' 

파일 1

#Scaffold   Position    Ref. Nuclueotide    Pid allele count    Pid allele  Non-pid allele count    Non-pid allele  Overlapping gene/region
NW_006532398.1  202035  C   35:0:0:0:0:0    A   0:0:29:0:0:0    C   KCND2
NW_006532656.1  289646  C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532656.1  289656  C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532656.1  289666  A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532656.1  289676  A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532657.1  636 A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532657.1  646 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532657.1  656 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532658.1  345 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1

파일 2

#Scaffold   Position    Ref. Nuclueotide    Pid allele count    Pid allele  Non-pid allele count    Non-pid allele
    HiC_scaffold_7  49526089    C   0:0:28:0:0:0    A   0:31:0:0:0:0    C
    HiC_scaffold_7  49539537    C   27:0:0:0:0:0    T   0:0:0:29:0:0    C
    HiC_scaffold_7  49972546    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972556    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972566    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972576    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972586    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972596    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972599    A   20:0:0:0:0:0    A   0:0:0:27:0:0    C
    HiC_scaffold_7  49972646    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C

파일 3

#Scaffold   Position    Ref. Nuclueotide    Pid allele count    Pid allele  Non-pid allele count    Non-pid allele   Scaffold   Position    Ref. Nuclueotide    Pid allele count    Pid allele  Non-pid allele count    Non-pid allele  
    HiC_scaffold_7  49526089    C   0:0:28:0:0:0    A   0:31:0:0:0:0    C   NW_006532398.1  202035  C   35:0:0:0:0:0    A   0:0:29:0:0:0    C   KCND2
    HiC_scaffold_7  49539537    C   27:0:0:0:0:0    T   0:0:0:29:0:0    C   NW_006532656.1  289646  C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972546    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532656.1  289656  C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972556    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532656.1  289666  A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972566    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532656.1  289676  A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972576    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532657.1  636 A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972586    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532657.1  646 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972596    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532657.1  656 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972599    A   20:0:0:0:0:0    A   0:0:0:27:0:0    C                               
    HiC_scaffold_7  49972646    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532658.1  345 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1

답변1

먼저 file2선행 탭을 편집하고 제거합니다. 그렇지 않으면 필드 3, 5, 7이 일치하지 않습니다.

awk -F"\t" '
  NR==FNR{
    a[FNR]=$3","$5","$7                  # save fields 3,5,7
    b[FNR]=(FNR==1 ? substr($0, 2) : $0) # save the line (remove first char on 1st line)
    last=FNR                             # save the last line nr
    next                                 # continue with next line
  }
  {
    printf $0                            # print current line
    for (i=1;i<=last;i++){
      if(a[i]==$3","$5","$7){            # fields 3,5,7 match?
        printf FS b[i]                   # append matching line
        a[i]=""                          # clear value
        break                            # break loop
      }
    }
    print ""
  }
' file1 file2

3,5,7 필드를 배열에 저장 a하고 현재 행을 $0배열에 저장합니다( b제목인 경우 $0첫 번째 문자 제외 ). 처리할 때 배열에서 일치하는 첫 번째 요소를 찾고 해당 인덱스를 사용하여 배열 행을 추가한 다음 배열 요소를 지웁니다.#
file2aba

답변2

나는 과거에 다음과 같이 egrep을 sort와 결합하여 비슷한 작업을 수행했습니다.

egrep '[A-z0-9]' file1 file2 | xargs -L1 | sed -e's/:/ /g' | sort -k4,4 -k6,6 -k8,8 -k1,1 

( 1,1정렬할 마지막 키는 파일 이름이 포함된 첫 번째 열입니다.) 물론 원본 파일의 열 3과 같이 열을 숫자로 정렬해야 하는 경우 -k4,4g또는 -를 수행하여 k4,4gr순서를 반대로 할 수 있습니다. 정렬 순서. 다른 열을 어떻게 정렬해야 하는지 모르겠습니다. "sort"로 인터리빙을 시작하면 awk의 파이프라인을 계속 사용하고 첫 번째 열(파일 이름)의 내용을 기반으로 하는 인쇄 조건을 사용할 수 있습니다. 내 컴퓨터에서는 이러한 유형의 작업이 더 쉬워지기 때문에 항상 파일 이름에 공백을 피합니다. "egrep"은 모든 줄을 가져오는 데 사용되며 줄 시작 부분에 파일 이름을 인쇄하는 방법일 뿐입니다. 이렇게 하면 Sort의 파일 이름을 사용하여 왼쪽에 원하는 열을 얻을 수 있는 방식으로 인터리브할 수 있습니다. 다음 사항은 아직 테스트하지 않았지만(버그일 수도 있고 서툴 수도 있음) 시작일 수 있습니다.

egrep '[A-z0-9]' $file1 $file2 | xargs -L1 | sed -e's/:/ /g' | sort -k4,4 -k6,6 -k8,8 -k1,1 | awk -vf1="${file1}" -vf2="${file2}" 'BEGIN {last="XXX"} { if ($1==f1) { if (last != "XXX") printf("\n"); } else { if (last==f2) printf("\n blank blank blank "); } ; printf("%s %s %s",$4,$6,$8); last=$1 } END {printf("\n");} ' > output.txt

sed의 의미는 egrep이 넣은 ":"를 제거하고 파일 이름을 별도의 첫 번째 열에 남겨 두는 것입니다. file2 파일 이름이 알파벳순으로 먼저 나오는 경우 -1,1rSort에서 ,를 사용해야 할 수도 있습니다. file1이 output.txt 파일의 왼쪽에 있음을 의미합니다.

또한 두 파일의 모든 열에는 저장된 정보에 공백이 없다고 가정합니다. "정렬"을 수행하면 열 헤더의 위치가 엉망이 되므로 별도로 처리해야 합니다.

관련 정보