2개 파일의 각 레코드 간 n개의 열 값을 비교하고 파일 2의 데이터를 파일 1에 추가합니다.

2개 파일의 각 레코드 간 n개의 열 값을 비교하고 파일 2의 데이터를 파일 1에 추가합니다.

다음과 같은 입력 파일이 있습니다.

입력 파일 예:

a|a1|a2|a3|a4|a5|...|a29|$2342
a|a1|a2|a3|a4|a5|...|a29|$2343
a|a1|a2|a3|a4|a5|...|a29|$2344
a|a1|a2|a3|a4|a5|...|a29|$2345
b|b1|b2|b3|b4|b5|...|b29|$100
c|c1|c2|c3|c4|c5|...|c29|$12

다른 파일의 데이터는 다음과 같습니다.

a|a1|a2|a3|a4|a5|...|a29|$2342|123|1.0|21.0
b|b1|b2|b3|b4|b5|...|b29|$100|12567|16.0|31.0
c|c1|c2|c3|c4|c5|...|c29|$12|6213|1.9|1.1

아래 설명된 대로 이 두 파일을 사용하여 최종 출력을 얻으려고 합니다.

a|a1|a2|a3|a4|a5|...|a29|$2342|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2343|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2344|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2345|123|1.0|21.0
b|b1|b2|b3|b4|b5|...|b29|$100|12567|16.0|31.0
c|c1|c2|c3|c4|c5|...|c29|$12|6213|1.9|1.1

이전 열 값을 비교할 수 #있고 동일한 것으로 확인되면 두 번째 파일의 값을 첫 번째 파일에 추가할 수 있다고 생각했습니다.

답변1

이는 일반적인 작업입니다 awk. 가능한 해결책은 다음과 같습니다.

awk '
NR==FNR {
    match($0,/.*\$/)
    pref = substr($0,RSTART,RLENGTH)
    rest = substr($0,RSTART+RLENGTH)
    suff = substr(rest, index(rest,"|"))
    suffixes[pref] = suff
    next
}
{
    match($0,/.*\$/)
    prefix = substr($0,RSTART,RLENGTH)
    match($0,/.*\$[0-9]+|/)
    data = substr($0,RSTART,RLENGTH)
    if (prefix in suffixes)
        print data suffixes[prefix]
}
' file2 file1

file1귀하의 질문에 "input file"이라는 파일은 어디에 있고 file2귀하의 질문에 "another file"이라는 파일은 어디에 있습니까? (목록에 있는 파일의 순서를 참고하세요.)

설명하다:

첫 번째 명령 블록은 첫 번째 파일을 읽을 때 실행됩니다 file2. 이는 NR==FNR첫 번째 파일을 읽을 때만 참인 조건에 의해 달성됩니다. 두 번째 명령 블록은 두 번째 파일에 대해서만 실행됩니다 ( 첫 번째 명령 블록의 명령 file1으로 인해 ). next첫 번째 블록은 접두사 pref와 접미사를 추출 suff하고 suffixes[pref] = suff각 접두사에 해당하는 접미사를 기억합니다. 이는 두 번째 블록의 데이터를 참조하는 데 필요합니다. 두 번째 블록에서는 유사한 명령이 실제로 실행되어 접두사를 추출하고 이를 사용하여 저장된 접미사에서 올바른 접미사를 가져옵니다. 한 가지 차이점이 있습니다. 기호 뒤의 숫자도 #새 접두사 데이터의 일부로 유지해야 하므로 match배열에 액세스하는 데 필요한 접두사 suffixes와 결과 데이터의 일부가 되는 데 필요한 접두사를 구별하는 두 번째 작업이 있습니다.

관련 정보