파일 1, 파일 2, 파일 3에 존재하는 레코드 찾기

파일 1, 파일 2, 파일 3에 존재하는 레코드 찾기

세 개의 파일이 있는데 file1.txt파일 형식이 동일합니다.file2.txtfile3.txt

나는 각각 열 2와 열 3을 기준으로 file1.txt출력 파일에 있는 레코드를 선택하고 싶습니다.file2.txtfile3.txtout.txt

out2.txt또한 추가 열( 의 4번째 열 file2.txt, 의 5번째 열 )이 포함된 다른 파일을 만들어야 합니다 file3.txt.

입력 예:

file1.txt

1. abc 1 a f11 f13 f14 
2. abd 2 b f12 f14 f13  
3. abe 4 d f13 f16 f12 
4. acf 6 s f14 f15 f19

file2.txt

 1. abc 1 a f21 f23 f24 
 2. abd 1 b f21 f24 f23  
 3. abe 4 d f24 f26 f22 
 4. acf 6 s f23 f25 f29

file3.txt

 1. abc 1 a f31 f33 f34 
 2. abd 2 b f31 f34 f33  
 3. acf 5 s f33 f35 f39 
 4. abe 4 d f34 f36 f32

원하는 출력

out.txt

 1. abc 1 a f11 f13 f14 
 2. abe 4 d f13 f16 f12 

out2.txt

 1. abc 1 a f11 f13 f14 f21 f31
 2. abe 4 d f13 f16 f12 f24 f34

답변1

확인하고 싶을 수도 있습니다장소diff3과 관련하여 이 프로그램을 사용하여 3개의 파일을 샘플 출력으로 비교할 수 있습니다.

$ diff3 parent.txt your.txt mine.txt

 ==== 

1:1,2c Hello, 

This is parent file.

2:1,2c Hello, 

This is your file. 

3:1,2c Hello, 

This is my file.

당신은 그것을 사용할 수 있습니다

diff3 file1.txt file2.txt file3.txt > output.txt

답변2

사용할 수 있는 모든 파일에서 공유 회선을 선택하려면 grep( out.txt)

grep -ho ' [0-9] [a-z] ' file3 | grep -Fof - file2 | grep -Ff - file1

실행 가능한 필드(변형)를 선택하고 이를 사용하여 cut -d' ' -f3,4 file3다음 및에서 검색합니다.file2file1

join명령을 사용하여 평소처럼 2개의 파일을 결합합니다 (놀랐습니다!)( out2.txt)

join -j 3 <(sort -k3,4 file1 | sed 's/ /+/3') \
          <(join -j 3 <(sort -k3,4 file2 | sed 's/ /+/3') \
                      <(sort -k3,4 file3 | sed 's/ /+/3') \
                      -o '1.4 2.4 1.3') \
          -o '1.1,1.2,1.3,1.4,1.5,2.1,2.2' | sed 's/+/ /'

따라서 세 번째와 네 번째 필드를 함께 작동하려면 이들을 연결해야 합니다( +예: 기호를 통해). join정렬된 행에서만 작업하므로 세 sort번째 및 네 번째 필드에서 작업합니다.
먼저 file2합계를 조인하면 결과는 부호를 조인 하고 제거하는 file3것과 동일합니다.file1+sed

답변3

가능한 해결책 awk(귀하의 질문에서 특정 요구 사항이 무엇인지 명확하지 않으므로 필요한 경우 편집하겠습니다):

awk 'FILENAME == ARGV[1] {
    m[$2,$3] = 0; z[$2,$3] = $5;
    next; 
}
FILENAME == ARGV[2] {
    if (($2,$3) in m) {
        m[$2,$3] = 1;
        z[$2,$3] = $5 " " z[$2,$3];
    }
    next;
}
{
    if (($2,$3) in m && m[$2,$3] == 1) {
        print $0 >"out.txt";
        print $0 " " z[$2,$3] >"out2.txt";
    }
}' file3.txt file2.txt file1.txt

세 번째 파일을 읽고 열 2와 열 3 키를 사용하여 두 개의 배열을 만듭니다. 첫 번째 배열은 0으로 채워지고 두 번째 배열은 out2.txt 파일에 필요한 값으로 채워집니다. 그런 다음 두 번째 파일을 읽고 열 2와 3의 키가 첫 번째 배열에 있는지 확인합니다. 그렇다면 값을 0에서 1로 변경하고 필요한 값을 out2.txt의 두 번째 배열에 있는 파일에 연결합니다. 마지막으로 첫 번째 파일을 읽고, 기존 키를 확인한 후 다음과 같이 out.txt 및 out2.txt 파일의 흥미로운 값을 인쇄합니다.

출력.txt다음을 포함해야 합니다:

1. abc 1 a f11 f13 f14
3. abe 4 d f13 f16 f12

출력2.txt다음을 포함해야 합니다:

1. abc 1 a f11 f13 f14 f21 f31
3. abe 4 d f13 f16 f12 f24 f34

관련 정보