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