file2의 열 2가 file1의 열 2와 다른 경우 file1의 열 1과 두 파일의 열 2를 인쇄합니다.

file2의 열 2가 file1의 열 2와 다른 경우 file1의 열 1과 두 파일의 열 2를 인쇄합니다.

각각 두 개의 열이 있는 두 개의 정렬되지 않은 파일이 있습니다. 열 1 값이 file2의 모든 행 값과 일치하지만 열 2 값이 다른 file1의 모든 행에 대해 열 1 값과 모든 열 2 값을 인쇄하고 싶습니다.

파일 1의 열 1에 대한 데이터가 파일 2에 없으면 삭제할 수 있습니다. 출력 파일에서 정렬 순서를 유지할 필요가 없습니다.

file1: 

2222,b2
4444,d4
1111,a1
3333,c3
5555,e5

file2:

2222,8f
5555,e9
4444,7c
3333,c3


OUTPUT file:
2222,b2,8f
4444,d4,7c
5555,e5,e9

답변1

두 번째 파일을 읽고 내용을 배열(키 = 첫 번째 필드, 값 = 두 번째 필드)에 저장한 다음 첫 번째 파일을 읽고 첫 번째 필드가 공통 키인지와 해당 두 필드가 다른지 여부를 확인합니다. 결과가 양수이면 키와 두 값을 모두 인쇄합니다.

awk 'BEGIN{FS=OFS=","}NR==FNR{z[$1]=$2;next}
{if (z[$1] && (z[$1]!=$2)){print $0, z[$1]}}' file2 file1

답변2

편집: 원래 작성된 질문은 다소 불분명하고 중요한 세부 사항이 부족했습니다. 다음은 질문이 명확해지면서 제가 쓴 두 가지 원래 답변입니다. 답변은 현재 작성된 질문과 유사한 간단한 경우에 매우 유용합니다.

  1. 파일을 정렬하고 일치시키는 경우 먼저 명령줄 유틸리티를 사용하여 paste각 줄에 파일 2의 두 번째 열을 추가하는 임시 세 번째 파일을 만드는 것이 좋습니다. 이 명령 paste의 출력을 에 파이프하면 awk솔루션 awk이 간단해집니다 $2 != $4{printf "%s %s %s", $1, $2, $4}.

    붙여넣기 -d"," file1 file2 | awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s", $1, $2, $4}'

  2. 정렬되지 않은 일치 파일의 경우 모두열쇠sortfile1과 fil2의 내용은 동일합니다. 단, 다음을 사용하여 paste셸에서 이 작업을 수행할 수 있습니다.bash프로세스 교체<( command )는 다음 예와 같이 형식을 취합니다 .

    붙여넣기 -d"," <(파일 1 정렬) <(파일 2 정렬) awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s ", $1, $2, $4}'

  3. 정렬되지 않고 일치하지 않는 파일 세트(현재 작성된 질문)에 대해서는 사용자 don_crissti의 답변을 참조하세요.

답변3

조인을 사용할 수 있나요?

sort -o file1 file1 
sort -o file2 file2 
join -t"," -1 1 -2 1 file1 file2 | awk '$2!=$3'

관련 정보