파일 1의 특정 패턴 위치를 기준으로 첫 번째 열을 기준으로 두 파일을 병합합니다.

파일 1의 특정 패턴 위치를 기준으로 첫 번째 열을 기준으로 두 파일을 병합합니다.

다음 파일이 있습니다.

파일 1(약 7000줄):

1010089 1402 6814 5543
1010121 6948 1402 2344
1305789 7589 7890 1402
3456889 1254 7389 1256

파일 2(약 300,000줄):

1010089 26 48 33
1010121 21 62 49

파일 1의 1402-s 위치에 따라 첫 번째 열을 기준으로 두 파일을 병합하고 싶습니다. 예를 들어 두 번째 열에 1402가 있으면 파일 1의 첫 번째 열, 파일 1의 두 번째 열, 파일 2의 두 번째 열을 인쇄하고 싶습니다. 1402가 세 번째 열에 있으면 파일 1의 첫 번째 열, 파일 1의 세 번째 열, 파일 2의 세 번째 열을 인쇄하고 싶습니다.

1402는 두 번째나 세 번째 열뿐만 아니라 모든 열에 나타날 수 있습니다. 그러나 한 줄에 두 번 이상 표시되지는 않습니다. 파일 2의 $1에 파일 1의 $1이 포함되어 있지 않으면 $1, 1402 및 알 수 없음을 인쇄하고 싶습니다.

원하는 출력:

1010089 1402 26
1010121 1402 62
1305789 1402 unknown
3456889 0000 unknown

다음 스크립트를 사용하여 두 파일을 병합합니다.

awk 'FNR==NR{arr[$1]=$2;next} ($1 in arr){print $0,arr[$1]}' file2 file1

답변1

file1, file2 및 각 열의 의미를 안다면 더 나은 변수 이름이 나올 것입니다. 하지만 모든 Unix 시스템의 모든 쉘에서 awk를 사용하지는 않습니다.

$ cat tst.awk
BEGIN { tgt = 1402 }
NR == FNR {
    file2[$1] = $0
    next
}
{
    fld = "0000"
    val = "unknown"
    for ( i=2; i<=NF; i++ ) {
        if ( $i == tgt ) {
            fld = $i
            if ( $1 in file2 ) {
                split(file2[$1],f)
                val = f[i]
            }
            break
        }
    }
    print $1, fld, val
}

$ awk -f tst.awk file2 file1
1010089 1402 26
1010121 1402 62
1305789 1402 unknown
3456889 0000 unknown

답변2

이 시도:

  $ awk 'FNR==NR {for (ii=2;ii<=NF;ii++) if ($ii=="1402") a[$1]=ii;next} 
         {if ($1 in a) {column=a[$1]; print $1,"1402",$column}}' file1 file2
   
  1010089 1402 26
  1010121 1402 62

이 솔루션은 많은 솔루션 중 하나입니다. 매우 일반적이므로 file2첫 번째 열 값이 중복되더라도 ~300,000개의 행을 모두 처리합니다. 값 "1402"는 의 첫 번째 열 뒤의 모든 열에 배치될 수 있습니다 file1.

화타이

관련 정보