각각 두 개의 열이 있는 두 개의 정렬되지 않은 파일이 있습니다. 열 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
편집: 원래 작성된 질문은 다소 불분명하고 중요한 세부 사항이 부족했습니다. 다음은 질문이 명확해지면서 제가 쓴 두 가지 원래 답변입니다. 답변은 현재 작성된 질문과 유사한 간단한 경우에 매우 유용합니다.
파일을 정렬하고 일치시키는 경우 먼저 명령줄 유틸리티를 사용하여
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}'
정렬되지 않은 일치 파일의 경우 모두열쇠
sort
file1과 fil2의 내용은 동일합니다. 단, 다음을 사용하여paste
셸에서 이 작업을 수행할 수 있습니다.bash
프로세스 교체<( command )
는 다음 예와 같이 형식을 취합니다 .붙여넣기 -d"," <(파일 1 정렬) <(파일 2 정렬) awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s ", $1, $2, $4}'
정렬되지 않고 일치하지 않는 파일 세트(현재 작성된 질문)에 대해서는 사용자 don_crissti의 답변을 참조하세요.
답변3
조인을 사용할 수 있나요?
sort -o file1 file1
sort -o file2 file2
join -t"," -1 1 -2 1 file1 file2 | awk '$2!=$3'