Awk/Grep - 행에서 값을 추출하고 파일 데이터와 일치하면 바꾸기 [찾기->비교->바꾸기]

Awk/Grep - 행에서 값을 추출하고 파일 데이터와 일치하면 바꾸기 [찾기->비교->바꾸기]

긴 줄이 포함된 파일과 참조 데이터가 포함된 파일이 있습니다.펄롱,프레이프.

내 목표는 특정 필드를 검색하는 것입니다.펄롱행은 이를 다음의 모든 값과 비교합니다.프레이프일치하는 경우 지정된 값으로 바꿉니다.

기본적으로 파일 검색펄롱- 1행 - 이의제기 4프레이프- 모든 행 - 필드 1.
일치하면 필드 6을 필드 2와 비교하고 일치하면 필드 4를 필드 3으로 바꿉니다. 1 또는 2가 일치하지 않으면 무시되고 변경되지 않습니다.

펄롱다음 데이터가 포함되어 있습니다.

Name|location|111|22|333|4444| |6666||8
Name|location| |56|67|| |6666||8

일부 필드는 비어 있고 일부 필드에는 공백이 있지만 모든 필드는 "|"로 구분됩니다.

프레이프다음 데이터가 포함되어 있습니다.

574|5327|1000
22|4444|2000
67|77|3000

반품:

Name|location|111|2000|333|4444| |6666||8
Name|location| |56|67|| |6666||8

나는 이것이 기능으로 가능하다는 것을 알고 있지만 사람들이 Awk에서 작업할 수 있는 복잡성에 충격을 받았습니다. 그래서 나는 그것을 사용하려고 노력했지만 어떤 문자열 검색/편집기도 작동할 것입니다.

답변1

귀하의 진술에 따르면 필드 1과 2를 키로 사용하여 해시(연관 배열)를 구성한 다음 필드 4와 6을 조회 키로 사용 RETURN하려는 것 같습니다 .FrefFlong

$ awk -F'|' '
    BEGIN{OFS = FS} 
    NR == FNR {a[$1 FS $2] = $3; next} 
    $4 FS $6 in a {$4 = a[$4 FS $6]} 
    1
' Fref Flong
Name|location|111|2000|333|4444| |6666||8
Name|location| |56|67|| |6666||8

관련 정보