파일 간의 기본 열을 모두 일치시키고 이러한 기본 열이 일치하면 출력 파일에 보조 열을 붙여넣습니다.

파일 간의 기본 열을 모두 일치시키고 이러한 기본 열이 일치하면 출력 파일에 보조 열을 붙여넣습니다.

3개의 파일이 있고 각 파일에는 고유한 수의 열이 있으며 모든 열은 탭으로 구분되어 있지만 일부 열은 3개의 파일 간에 공유됩니다. 이것은 일종의 "집계" 파일을 생성하는 데 사용하려는 3개 파일 간의 공유 열입니다.

아래 이미지는 파일의 예를 보여줍니다. 기본적으로 MAIN1과 MAIN2 열 사이의 파일을 일치시키고 싶습니다. 두 열 모두 세 파일 간에 일치해야 합니다.

두 파일 사이에 MAIN1과 MAIN2가 일치하는 경우 file2의 "minor8" 열을 file1의 테이블 오른쪽에 추가하고 싶습니다. 그런 다음 MAIN1과 MAIN2가 두 파일 간에 일치하는 경우 file3의 "minor9"를 file1 테이블 오른쪽에 추가하려고 합니다. "minor8"은 file1의 가장 오른쪽 열(열 이름: "minor3") 옆에 있어야 하므로 새 출력 파일에서는 "minor9"가 "minor8" 옆에 있기를 원합니다. OUTPUT 파일은 이상적인 최종 파일이 어떤 모습이어야 하는지에 대한 아이디어를 제공합니다(이 샘플 OUTPUT에는 약간의 불일치가 있지만).

한 번에 하나의 파일을 실행하기 위해 몇 가지 awk 명령을 사용해 보았지만 현재로서는 awk에 대해 조금만 알고 있습니다.

나는 비슷한 것을 시도했습니다 :

awk 'NR==FNR{a[$1$3]++;next} $1$3 in a {$1$3==$2$3 FS a[$1$3]; print}' file1 file2 > OUTPUT

하지만 확실히 효과가 없었습니다. 아마도 많은 내용이 누락되었거나 분명히 잘못되었을 수 있기 때문입니다.

이 줄은 아직 file3을 고려하지 않습니다.

누구든지 file1, file2 및 file3을 사용하여 OUTPUT 파일을 얻는 방법을 제안할 수 있다면 좋을 것입니다. 귀하의 조언을 활용하기를 바랍니다. 한 단계에서 3개의 파일을 1개의 출력 파일로 병합하는 것이 너무 어려운 경우(확실히 어떻게 해야 할지 모르겠습니다), 한 번에 1개의 파일에 대해 이 작업을 수행하는 방법을 알려주십시오. 자세한 설명은 매우 환영합니다.

감사합니다!

처음 몇 개의 댓글을 바탕으로 한 사용자로부터 매우 유용한 솔루션을 얻었지만 게시된 이미지가 그다지 유용하지 않다는 것을 깨달았습니다.

기본적으로 다음은 3개 파일의 예입니다("탭"이 약간 혼란스럽습니다).

파일 1:

MAIN1   minor1  MAIN2   minor3
1  bla1    a    blabla1
1  bla2    b    blabla2
1  bla3    c    blabla3
2  bla4    a    blabla4
2  bla5    d    blabla5
3  bla6    e    blabla6
4  bla7    f    blabla7
5  bla8    a    blabla8
5  bla9    g    blabla9

파일 2:

minor8  MAIN1   MAIN2
yes1    2   d
yes2    3   e
yes3    4   f
yes4    5   a
yes5    5   g
yes6    1   a
yes7    1   b
yes8    1   c
yes9    2   a

파일 3:

MAIN1   MAIN2   minor9
5   a   sure1
5   g   sure2
1   a   sure3
1   b   sure4
1   c   sure5
2   a   sure6
2   d   sure7
3   e   sure8
4   f   sure9

필수 출력 파일:

MAIN1   minor1  MAIN2   minor3  minor8  minor9
1   bla1    a   blabla1 yes6    sure3
1   bla2    b   blabla2 yes7    sure4
1   bla3    c   blabla3 yes8    sure5
2   bla4    a   blabla4 yes9    sure6
2   bla5    d   blabla5 yes1    sure7
3   bla6    e   blabla6 yes2    sure8
4   bla7    f   blabla7 yes3    sure9
5   bla8    a   blabla8 yes4    sure1
5   bla9    g   blabla9 yes5    sure2

G-Man의 코드는 이 출력 파일을 다시 생성할 수 있으므로 G-Man에게 감사드립니다!

제가 언급하는 것을 잊어버린 한 가지는 귀하의 코드가 이를 수행하지 않는다는 것입니다(제가 아는 한). 일치하는 항목이 없으면 file1에서 행을 제거합니다.

파일 2와 3의 MAIN1 열과 MAIN2 열이 정확히 일치하지 않더라도 기본적으로 파일 1에 대해 이러한 행을 유지해야 합니다. 일치하는 항목이 없으면 해당 특정 MAIN1, MAIN2 조합에 대한 빈 열 항목을 보고 싶습니다.

내가 설명하는 방식이 충분히 명확하기를 바랍니다.

어쨌든, 도와주셔서 정말 감사드립니다. 가까운 시일 내에 단순히 도움을 요청하는 것 이상으로 이 포럼에 기여할 수 있기를 바랍니다...

예를 들어(파일 2와 3에 MAIN1, MAIN2 조합이 누락된 경우 출력은 다음과 같습니다):

MAIN1   minor1  MAIN2   minor3  minor8  minor9
1   bla1    a   blabla1 yes6    sure3
1   bla2    b   blabla2 yes7    sure4
1   bla3    c   blabla3         sure5
2   bla4    a   blabla4 yes9    sure6
2   bla5    d   blabla5 yes1    sure7
3   bla6    e   blabla6 yes2    sure8
4   bla7    f   blabla7 yes3    
5   bla8    a   blabla8 yes4    sure1
5   bla9    g   blabla9 yes5    sure2

이를 가능하게 하기 위해 G-Man의 코드를 편집하는 방법에 대한 제안 사항이 있습니까?

답변1

다음 파일을 생성합니다:

merge21:

시작 {
        IFS="\t"
        OFS = "\t"
}
NR==FNR { #파일 2
        키 =$2","$3
        존재[키] = 1
        작은 8[키] =1
        다음
}
{#파일 1
        키=$1 "," $3
        if (현재[키]) $1, $2, $3, $4,마이너 8 [키]
}

merge312:

시작 {
        IFS="\t"
        OFS = "\t"
}
NR==FNR { #파일 3
        키 =$1","$2
        존재[키] = 1
        작은 9[키] =$3
        다음
}
{#파일 1 + 파일 2
        키=$1 "," $3
        if (현재[키]) $1, $2, $3, $4,$5, 미성년자 9 [열쇠]
}

그것들은 거의 동일합니다. 차이점을 굵게 표시했습니다. 이제 명령을 입력하세요.

awk -f merge21 file2 file1 | awk -f merge312 file3 -

이는 데이터에 쉼표가 포함되어 있지 않다고 가정하지만 실제로는 존재 여부에 따라 다릅니다.일부데이터에 나타나지 않는 문자열입니다. 더 많은 열을 지원하기 위해 이것을 확장하는 것은 쉽지 않습니다. 이것할 수 있다한 번에 모든 작업을 수행하도록 향상될 수 있지만 awk이는 좀 더 복잡하고 (IMNSHO) 노력할 가치가 없습니다.

이는 파일에 있는 데이터의 "내부 조인"을 생성합니다.INNER 연결과 OUTER 연결의 차이점몇 가지 정의는 스택 오버플로를 확인하세요. 이를 "왼쪽 외부 조인"으로 변경하려는 경우 허용됩니다 (그리고음란하게투표됨) 이 질문에 대한 대답은 "첫 번째 테이블의 모든 행과 다른 테이블의 공통 행"으로 해석됩니다. 마지막 문을 다음merge21으로

        if (present[key]) print $1, $2, $3, $4, minor8[key]
        else              print $1, $2, $3, $4, "-"

또한 에서 " " 라인 과 " " 라인을 merge312제거했다고 가정하면 출력은 다음과 같습니다 .1 cfile24 ffile4

MAIN1   minor1  MAIN2   minor3  minor8  minor9
1       bla1    a       blabla1 yes6    sure3
1       bla2    b       blabla2 yes7    sure4
1       bla3    c       blabla3 -       sure5
2       bla4    a       blabla4 yes9    sure6
2       bla5    d       blabla5 yes1    sure7
3       bla6    e       blabla6 yes2    sure8
4       bla7    f       blabla7 yes3    -
5       bla8    a       blabla8 yes4    sure1
5       bla9    g       blabla9 yes5    sure2

그리고 당연히 제거할 수도 있습니다.-문자 대 sed(물론 실제 데이터에 실제로 하이픈이 포함된 경우 누락된 데이터에 대한 자리 표시자로 사용되지 않은 문자나 문자열을 선택하십시오.)

관련 정보