awk 및 shellscript를 사용하여 로그 파일을 조작하는 데 문제가 있습니다.

awk 및 shellscript를 사용하여 로그 파일을 조작하는 데 문제가 있습니다.

awk에 문제가 있습니다. 첫 번째 필드와 세 번째 필드가 서로 다른 2개의 파일에서 일치하는 경우 열을 연결하고 싶습니다. 아마도 배열 함수를 사용하는 것이 더 나을 것 같은데, 이게 헷갈리네요.

입력 예

file1
0x11110293030,2019-10-13T12:13:39,8.8.8.8,KeitheNoop,workgroupa
0x22222211111,2019-10-12T12:17:23,8.8.8.8,KattheNoop,workgroups
0x21034922113,2019-10-14T15:12:63,8.8.8.8,KoitheNoop,workgroupz

file2
0x11110293030,2019-10-13T12:22:44,8.8.8.8,KeiLeftAll,workgroupk
0x22222211111,2019-10-14T12:19:23,8.8.8.8,KattheNoop,workgroups
0x21034922113,2019-10-14T15:34:63,8.8.8.8,KoitheNoop,workgroupz

예상 출력

0x11110293030,8.8.8.8,KeitheNoop,workgroupa,2019-10-13T12:13:39 ~ 2019-10-13T12:22:44,8.8.8.8,KeiLeftAll,workgroupk
0x22222211111,8.8.8.8,KattheNoop,workgroups,2019-10-12T12:17:23 ~ 2019-10-14T12:19:23,8.8.8.8,KattheNoop,workgroups
0x21034922113,8.8.8.8,KoitheNoop,workgroupz,2019-10-14T15:12:63 ~ 2019-10-14T15:34:63,8.8.8.8,KoitheNoop,workgroupz

가능하다면 이러한 코드가 어떻게 작동하는지 간략하게 설명해주세요. 귀하의 도움에 미리 감사드립니다.

답변1

awk -F',' '{
  if (FNR==NR){
    a[$1"@"$3]=$4","$5","$2
  }
  else if ($1"@"$3 in a){
    print $1","$3","a[$1"@"$3]" ~ "$2","$3","$4","$5
  }
}' file1 file2

첫 번째 파일이 처리되면( FNR==NR현재 파일의 입력 레코드 수가 전체 레코드 수와 동일함, 즉 첫 번째 파일이 처리되고 있음을 의미) 네 번째, 다섯 번째 및 두 번째 필드를 포함하는 문자열이 첫 번째 및 세 번째 필드와 결합됩니다 a. 필드는 병합되어 배열에 @인덱스로 저장됩니다.

두 번째 파일( else if)을 처리하고 현재 줄의 첫 번째와 세 번째 필드에 대한 키 조합이 배열에 있는 경우 첫 번째와 세 번째 필드, 저장된 배열 값, 물결표 및 필드 2~5를 인쇄합니다.

귀하의 질문은 "숙제"처럼 보입니다. 배열의 작동 방식을 이해하고 싶다면 awk직접 시도해 보는 것이 좋습니다.

관련 정보