awk를 사용하여 여러 파일의 내용 추가

awk를 사용하여 여러 파일의 내용 추가

file1, file2, file3이름이 ... 다음 형식인 파일이 있다고 가정해 보겠습니다.

파일 1

blah blah blah
[PATTERN0]
a10
a20
a30
[PATTERN1]
a11
a21
a31
[PATTERN3]
a13
a13
a33

파일 2

blah blah blah
[PATTERN0]
b10
b20
b30
[PATTERN1]
b11
b21
b31
[PATTERN3]
b13
b13
b33

내가 원하는 것은 특정 패턴(예: PATTERN0)을 따르는 모든 파일에 대한 각 개별 항목의 합계를 포함하는 파일로 끝나는 것입니다. 예를 들어 파일에는 다음이 있어야 합니다.

a10+b10
a20+b20
a30+b30

지금까지는 rrad를 사용하여 값만 인쇄할 수 있으며

awk '/PATTERN0/ {for(i=1; i<=3; i++) {getline;print $1}}' file*

어떻게 해야할지 아시나요?

답변1

awk경우 항상 두 개 이상의 파일이 있다고 가정하면 모든 파일은 [PATTERN0]과 사이에 동일한 수의 줄이 있으며 [PATTERN1]해당 줄은 실제로 숫자입니다.

awk '
    BEGIN {
        # discard the garbage before [PATTERN0]
        for (i = 1; i < ARGC; i++) {
            do      
                getline str <ARGV[i]
            while (str !~ /\[PATTERN0\]/)
        }

        # read sum from first file, then add numbers in turn from the other files
        while ((getline sum <ARGV[1]) && sum !~ /\[PATTERN1\]/) {
            for (i = 2; i < ARGC; i++) {
                getline nr <ARGV[i]
                sum += nr
            }
            print sum
        }
    }' file1 file2 file3 ...

답변2

Paste + awk를 조합하면 좋은 결과를 얻을 수 있습니다.

$ paste -d"+" file1 file2 |awk -F"[+]" '/PATTERN/{print $1;next}1'

나는 그것을 피하기 위해 awk를 호출합니다 [PATTERN0]+[PATTERN0]- 당신은 그것을 제거할 수 있습니다. 또는 전혀 인쇄하고 싶지 않다면 [PATTERN]마지막 awk를 다음으로 변경하십시오.
...|awk -F"[+]" '/PATTERN/{next}1

시험:

$ paste -d"+" <(echo "$a") <(echo "$b") |awk -F"[+]" '/PATTERN/{next}1'
a10+b10
a20+b20
a30+b30
a11+b11
a21+b21
a31+b31
a13+b13
a13+b13
a33+b33

간단한 awk 솔루션도 있습니다.

$ awk -v RS="[PATTERN[0-9]+]" '{for (i=1;i<=NF;i++) (NR==FNR)?a[RT][i]=$i:a[RT][i]=a[RT][i] "+" $i} \
END{for (k in a) for (l in a[k]) print a[k][l]}' <(echo "$a") <(echo "$b")

추신: 위의 awk는 .awk를 삭제하면 한 줄이 됩니다 \. 가독성을 위해 두 줄로 나눴습니다.

이 awk의 함정은 END 섹션에서 인쇄가 정확하지만 awk가 이 for 메서드를 사용하여 배열을 인쇄하는 방식으로 인해 인쇄가 무작위 PATTERN 순서로 이루어집니다(즉, [PATTERN3]데이터가 대신 먼저 인쇄될 수 있음).[PATTERN0]

관련 정보