awk를 사용하여 3개 파일 처리

awk를 사용하여 3개 파일 처리

다음 파일을 고려하십시오.

file1:

boo,8,1024
foo,7,2048

file2:

foo,0,24,154
noo,0,10,561

file3:

24,154,7,1024,0

내가 필요한 건 가는 거야파일 1그리고 $2==7true인지 확인 $1하고 ,$2$3파일 1;이제 비교해야 합니다 $1.파일 1$1와 같음파일 2;사실이라면, 나는 $3다음을 취해야 합니다.$4파일 2에는 존재하지 않습니다파일 1, 그럼 나 가야 해파일 3그리고 $1그것이 나오는지 확인하십시오파일 3$3와 같음파일 2, 그리고 $2에서파일 3$4와 같음파일 2;그렇다면 내가 보낸 것인지 확인해야 합니다 $2.파일 1$3와 같음파일 3, 그러면 이 조건이 true이면 $3비교 해야 합니다.파일 1$4와 함께파일 3, 만약 $3파일 1$4에서 보다파일 3.

다음 스크립트를 시도했습니다.

cat [file1] [file2] [file3] | 
awk -F, 
'{if(NF==3)
    {if($2==7){a[$1]=$1; b[$1]=$2; c[$1]=$3}
    }else
        {if(NF==4){if(a[$1]==$1){d[$3]=$3; e[$4]=$4}
                  }else
                        {if(NF==5){if(d[$1]==$1 && e[$2]==$2){print a[$1], b[$1], c[$1], d[$1]}}
                        }
                  }

  }'

원하는 출력은 다음과 같습니다.

foo,7,2048,24,154,1024

답변1

이것은 나에게 효과적입니다.

awk -F, 'FNR==1{++f} \
  f==1 && $2==7 {a1[$1]++; a2[$2]=$3; o=$0} \
  f==2 && a1[$1] {o=o","$3","$4; a3[$3]=$4} \
  f==3 && a3[$1] && $2==a3[$1] && a2[$3] && $4<a2[$3] {print o}' \
file1 file2 file3

설명하다:

  • 첫 번째 줄( FNR==1{++f})은 파일 인덱스를 증가시켜 나중에 우리가 1-3에 있는 파일을 결정합니다.
  • 파일 1:만약 $2같다면7
    • a1$1인덱스, a2인덱스 $2, $3값 으로 배열 채우기
    • o변수의 처음 3개 필드 작성 (출력)
  • 파일 2:같음 $1( file2이전에 작성됨) $1file1a1
    • 출력 변수에 $3합계를 추가합니다 .$4o
    • a3$3인덱스와 값으로 배열을 채웁니다 $4.
  • 파일 3:만약에:
    • $1file2s와 동일 $3(색인 a3)
    • $2file2s와 동일 $4(값 a3)
    • $3file1s와 동일 $2(색인 a2)
    • $4file1s 아래 $3(값 a2)
  • 그 다음에:
    • 인쇄된 값입니다 o.

답변2

TXR 솔루션:

@(repeat)
@id,@val0,@val1
@  (next)
@  (skip)
@id,@nil,@val2,@val3
@  (next)
@val2,@val3,@val0,@val4,@val5
@  (require (< (int-str val4) (int-str val1)))
@  (output)
@id,@val0,@val1,@val2,@val3,@val4
@  (end)
@(end)

달리기:

$ txr join.txr file1 file2 file3
foo,7,2048,24,154,1024

그러나 기민한 관찰자는 코드 어디에도 7이 지정되지 않고 출력에만 나타나는 것을 알 수 있습니다! 이는 코드가 실제로 file1일치 및 제약조건을 만족하는 모든 조합을 인쇄합니다.. 샘플 데이터에 포함된 유일한 val0데이터 입니다 7.

더 많은 조합이 발견되면 7다음과 같은 조합으로 제한될 수 있습니다.

$ txr -Dval0=7 join.txr file1 file2 file3
foo,7,2048,24,154,1024

# how about 6?
$ txr -Dval0=6 join.txr file1 file2 file3
# no output

TXR 패턴 추출 언어는 여러 줄의 추출 패턴과 비텍스트 제약 조건, 출력 등과 같은 삽입된 부작용을 사용하여 여러 파일에 걸쳐 변수 이름을 반복함으로써 암시적 역참조와 일치하는 대규모 패턴을 제공합니다.

신중하게 번역된 TXR Lisp awk 솔루션을 수락하세요.awk매크로:

(awk (:begin (set fs "," ofs ","))
     (:let o (a1 (hash :equal-based)) (a2 (hash)) (a3 (hash)))
     (t (mf [orf int-str identity])) ;; map those fields to integers, which can be
     ((and (= arg 1) (= [f 1] 7)) (inc [a1 [f 0] 0])
                                  (set [a2 [f 1]] [f 2])
                                  (set o rec))
     ((and (= arg 2) [a1 [f 0]]) (set o `@o,@[f 2],@[f 3]`)
                                 (set [a3 [f 2]] [f 3]))
     ((and (= arg 3)
           [a3 [f 0]]
           (= [f 1] [a3 [f 0]])
           [a2 [f 2]]
           (< [f 3] [a2 [f 2]])) (prn o)))

달리기:

$ txr awkit.tl file1 file2 file3
foo,7,2048,24,154

,1024필요한 부분이 출력에서 ​​누락되었습니다. 원본 "Awk Classic"에는 이러한 동작이 있었습니다.

관련 정보