AWK를 사용하여 지정되지 않은 수의 파일 조합에 대한 출력을 인쇄합니다.

AWK를 사용하여 지정되지 않은 수의 파일 조합에 대한 출력을 인쇄합니다.

내 목표는 하위 디렉터리로 이동하여 SUB라고 부르는 것입니다. 여기에는 각각 5개의 열이 있고 항상 동일한 수의 행이 있는 많은 텍스트 파일이 있습니다. 2-5의 모든 열을 합산하고 첫 번째 열을 유지한 다음 파일을 출력하는 큰 "합계" 파일을 원합니다. 파일 수가 적다는 것을 알고 있는 경우 다음과 같이 수행할 수 있습니다.

cd SUB

numfiles=(*)
numfiles=${#numfiles[@]}

if [ $numfiles = 1 ]
then
paste * | awk '{print $1, $2, $3, $4, $5}' > sum
fi

if [ $numfiles = 2 ]
then
paste * | awk '{print $1, ($2+$7), ($3+$8), ($4+$9), ($5+$10)}' > sum
fi    

그러나 SUB의 파일 수가 1에서 100까지일 수 있으므로 이는 번거로운 접근 방식입니다. 당신의 도움을 주셔서 감사합니다!

PS 새 "sum" 파일은 입력 텍스트 파일과 동일한 형식이어야 하며 모두 동일하게 보입니다. 예를 들어, SUB에 항목이 있는 두 개의 파일이 포함되어 있는 경우

1 2 3 4 5
2 2 3 4 5

그리고

1 4 2 7 1
2 2 5 1 9

그런 다음 "sum" 파일은 다음과 같아야 합니다.

1 6 5 11 6
2 4 8 5 14

답변1

awk '
    NR==FNR {
        # assuming column 1 is the same for all files, remember it.
        # only need to do this for the first file
        col1[FNR] = $1
    }
    { for (i=2; i<=NF; i++) sum[FNR,i] += $i }
    END {
        for (i=1; i<=FNR; i++) {
            printf "%s", col1[i]
            for (j=2; j<=NF; j++) printf "%s%s", OFS, sum[i,j]
            print ""
        }
    }
' file1 file2
1 6 5 11 6
2 4 8 5 14

nawk, gawk 및 mawk와 함께 작업해야 합니다.

답변2

여기요. 이것은 실제로 gawk바닐라 대신 사용됩니다 awk. 정말로 true를 사용해야 한다면 awk구조 h[x][y]h[x ";" y].

cd SUB
awk '
    BEGIN { PROCINFO["sorted_in"] = "@ind_num_asc" }
    { h[FNR][1] = $1; for (n=2; n<=5; n++) { h[FNR][n] += $n } }
    END { for (r in h) { print h[r][1], h[r][2], h[r][3], h[r][4], h[r][5] } }
' *

예제 입력을 기반으로 예상되는 출력을 제공합니다.

PROCINFO댓글에 제안된 대로 설정을 추가했습니다 .

관련 정보