일치하는 항목이 여러 개인 경우 특정 열 값을 기준으로 두 파일 간의 공통 행을 grep합니다.

일치하는 항목이 여러 개인 경우 특정 열 값을 기준으로 두 파일 간의 공통 행을 grep합니다.

파일1의 컬럼3과 파일2의 컬럼2를 일치시키고 싶은데, 그 후에 일치하는 행의 모든 ​​열을 한 행에 인쇄하고 싶은데, 방법은 알지만 문제는 파일2의 컬럼2에 고유한 값이 없는 경우입니다. 그러면 출력은 file2입니다. 마지막으로 일치하는 라인입니다. 하지만 별도의 파일에 여러 개의 일치하는 줄이 있고(충돌) 출력 파일의 고유한 줄만 일치시키고 싶습니다.
예:-
다음과 같은 두 개의 파일이 있습니다.

file1

abc ram_1 ram1  
abc ram[0] ram0  
bcd raghu_reg_9 raghu9  
cde tanu/8 tanu8 

file2

1 ram1  
2 thakur56  
3 ram0  
4 ram1  
5 ram2  
6 raghu9  
7 raghu  

나는 다음과 같이 awk를 사용해 보았습니다.

awk 'FNR==NR{a[$2]=$0;next} { if ($3 in a){print a[$3],$1,$2}}' file2 file1  

결과는 다음과 같습니다.

4 ram1 abc ram_1  
3 ram0 abc ram[0]  
6 raghu9 bcd raghu_reg_9 

그러나 나는 출력 1이 다음과 같기를 원합니다.

3 ram0 abc ram[0]  
6 raghu9 bcd raghu_reg_9  

출력 2는 다음과 같습니다.

1 ram1 abc ram_1  
4 ram1 abc ram_1  

파일 2의 열 2에 두 개의 ram1 항목이 있기 때문에 파일 1의 열 3의 ram1을 파일 2의 열 2의 ram1과 일치시킬 때 이는 두 번 일치하고 두 번째 ram1을 출력으로 제공하지만 다음과 같습니다. 어떤 상황이 발생하면 어떤 줄을 선택해야 할지 수동으로 결정할 수 있도록 충돌하는 줄을 별도의 파일로 이동해야 합니다.

답변1

join(1)다음을 사용하여 일치하는 각 키에 대한 파일을 한 줄로 결합 할 수 있습니다 .

$ join -1 3 -2 2 -o 2.1,2.2,1.1,1.2 <(sort -k3,3 file1) <(sort -k2,2 file2)
6 raghu9 bcd raghu_reg_9
3 ram0 abc ram[0]
1 ram1 abc ram_1
4 ram1 abc ram_1

그 기능은 파일 1의 필드 3( -1 3)과 파일 2의 필드 2( ) -2 2에 있는 두 파일을 연결하고 파일 2의 필드 1과 2를 출력한 다음 파일 1( -o 2.1,2.2,1.1,1.2)의 필드 1과 2를 출력하는 것입니다.

조인에는 각 입력 파일이 조인 필드에서 정렬되어야 하므로 프로세스 대체를 <(sort -k3,3 file1)사용하여 동시 입력 파이프를 수행하고 이를 조인 명령에 제공합니다.<(sort -k2,2 file2)bash(1)

uniq(1)이 출력을 사용하면 고유하고 중복된 행을 추출 할 수 있습니다 . 위의 명령을 호출하려면 joinit다음을 수행할 수 있습니다.

$ joinit | uniq -u -f 1
6 raghu9 bcd raghu_reg_9
3 ram0 abc ram[0]

-u첫 번째 필드( )를 건너뛴 후 유일한 행( )을 인쇄합니다 -f 1.

$ joinit | uniq -D -f 1
1 ram1 abc ram_1
4 ram1 abc ram_1

-D첫 번째 필드( )를 건너뛴 후 모든 중복 행( )을 인쇄합니다 -f 1.

이를 함께 결합하여 출력을 output1합계로 만들려면 output2두 개의 개별 필터를 통해 파이프라인에 데이터를 공급할 수 있습니다 tee(1).joinit

$ join -1 3 -2 2 -o 2.1,2.2,1.1,1.2 <(sort -k3,3 file1) <(sort -k2,2 file2) \
  | tee >(uniq -u -f 1 > output1) | uniq -D -f 1 > output2

다시 말하지만, 이는 bash(1)"프로세스 대체"를 활용하여 동시 출력 파이프가 각 파이프에 다른 명령을 공급하도록 합니다 uniq.

관련 정보