먼저 각 파일의 열 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
첫 번째 문자 제외 ). 처리할 때 배열에서 일치하는 첫 번째 요소를 찾고 해당 인덱스를 사용하여 배열 행을 추가한 다음 배열 요소를 지웁니다.#
file2
a
b
a
답변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,1r
Sort에서 ,를 사용해야 할 수도 있습니다. file1이 output.txt 파일의 왼쪽에 있음을 의미합니다.
또한 두 파일의 모든 열에는 저장된 정보에 공백이 없다고 가정합니다. "정렬"을 수행하면 열 헤더의 위치가 엉망이 되므로 별도로 처리해야 합니다.