2개의 별도 파일에 있는 필드를 일치시키기 위해 {BEGIN FS = "|"}가 포함된 awk 명령을 사용하면 빈 출력 줄이 반환됩니다.

2개의 별도 파일에 있는 필드를 일치시키기 위해 {BEGIN FS = "|"}가 포함된 awk 명령을 사용하면 빈 출력 줄이 반환됩니다.

파일 2개: data1

    Name       |formula           |no. |dose|days|cost  |msg|em|notes
    Fname-Lname|BXXXT+GG          |8262|4   |14  |57.78 |   |  |sq
    Fname-Lname|SJXXT+GG          |8263|4¾  |14  |105.15|   |  |IB
    Fname-Lname|FJDHT+BH,LG,CQC,ZX|8264|5¾  |14  |46.20 |   |  |IB

데이터 2

10/12/2020|more-data-3456|105.15
10/12/2020|more-data-3456|95.10
11/12/2020|more.data-3456|30.30
14/12/2020|more-data-3456|45.55

코드 조각을 사용하고 있습니다

awk 'BEGIN {FS = "|" } NR==FNR{a[$6];next} $3 in a {print $0}' data1 data2

파일 data1의 $6과 일치하는 값은 파일 data2의 $3 위치에도 나타납니다. 일치하는 항목이 있으면 파일 data2($0)에 일치 항목이 포함된 전체 레코드를 인쇄합니다. 나는 기대한다:

10/12/2020|more-data-3456|105.15

하지만 빈 줄만 출력됩니다. "|"교체 명령을 사용하여 파일 구분 기호를 제거했는데 명령 코드가 예상대로 정확하게 작동하지만 필드 구분 기호를 최대한 유지 " "하려고 합니다 . |BEGIN 블록을 추가하면 이런 문제가 발생하는 이유를 알고 싶습니다. awk가 S6에서 데이터를 가져오는 대신 빈 배열을 로드하게 됩니까? 내 awk 수준은 초보자 수준보다 약간 높습니다. 편집: 또한 -F 매개변수를 사용하여 빈 줄을 출력하는 동일한 결과를 얻었습니다. 저는 고크를 사용하고 있습니다.

답변1

  1. DOS 줄 끝이 있을 수 있습니다.내 도구 출력이 자체적으로 덮어쓰이는 이유와 해결 방법이므로 존재하는 경우 제거하십시오(아래 스크립트에서 해당 공백과 기타 후행 공백을 제거하겠습니다 sub()).
  2. 빈 줄 출력을 얻는다면 각 입력 파일에 빈 줄이 있는 것입니다. 그러나 실제로는 빈 줄 출력을 얻는 것이 아니라 대신에 얻어야 하는 한 줄의 출력을 얻게 되지만 덮어쓰기로 끝나게 됩니다 105.15. CR뒷줄의 시작 - 출력을 파이프하여 | cat -v이것이 사실인지 확인합니다.
  3. 귀하의 입력에는 일부 위치에서 s 앞뒤에 공백이 있으므로 일치하도록 |설정해야 합니다 .FSFS=" *[|] *"
  4. {print $0}이것이 기본 동작이므로 작성할 필요가 없습니다.

이 시도:

awk 'BEGIN{FS=" *[|] *"} {sub(/[[:space:]]+$/,"")} NR==FNR{a[$6];next} $3 in a' data1 data2

답변2

귀하의 코드는 GNU awk 5.1.0과 macOS awk 20200816 모두에서 있는 그대로 작동합니다.

어떤 버전의 awk를 사용하고 있나요?

명령줄 인수를 사용하여 필드 구분 기호를 설정할 수도 있습니다 -F. 이렇게 하면 이 BEGIN블록이 필요하지 않습니다.

관련 정보