첫 번째 열로 여러 파일 병합

첫 번째 열로 여러 파일 병합

내 디렉토리에는 다른 이름을 가진 50개 이상의 파일이 있습니다. 예를 들어:

파일 1:

Type,A,
RR,1,
CD,2,

파일 2:

Type,B,
CD,2,
FG,3,

파일 3:

Type,C,
RR,5,
FG,8,
QR,9,

원하는 출력

Type,A,B,C,
CD,2,2,,
FG,,3,8,
QR,,,9,
RR,1,,5

시도해 보았지만 운이 없었 join습니다 paste. 어떤 제안이 있습니까?

답변1

이것은 꽤 까다로운 GNU awk입니다. gawkGNU awk 필요( )배열의 배열

gawk -F, '
    NR  == 1 {n=1; header[n] = $1}
    FNR == 1 {n++; header[n] = $2; next}

    !($1 in data) {data[$1][1] = $1}
    {data[$1][n] = $2}

    # from https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html
    function join(array, start, end, sep,    result, i)
    {
        if (sep == "")
            sep = " "
        else if (sep == SUBSEP) # magic value
            sep = ""
        result = array[start]
        for (i = start + 1; i <= end; i++)
            result = result sep array[i]
        return result
    }

    END {
        print join(header, 1, n, FS)
        PROCINFO["sorted_in"] = "@ind_str_asc"   # for sorted output
        for (type in data)
            print join(data[type], 1, n, FS)
    }
' file{1,2,3}
Type,A,B,C
CD,2,2,
FG,,3,8
QR,,,9
RR,1,,5

각 파일에 2개의 열이 있다고 가정하므로 완전히 보편적이지 않습니다.


GNU awk에 의존하지 않는 버전(mawk로 테스트)

mawk -F, '
    NR  == 1 {n=1; header[n] = $1}
    FNR == 1 {n++; header[n] = $2; next}
    {key[$1]; data[$1,n] = $2}
    END {
        for (i=1; i<=n; i++)
            printf "%s%s", header[i], (i==n ? ORS : FS)
        for (type in key) {
            printf "%s%s", type, FS
            for (i=2; i<=n; i++)
                printf "%s%s", data[type,i], (i==n ? ORS : FS)
        }
    }
' file{1,2,3}

답변2

실제 다차원 배열이 없더라도 이는 특별히 어렵지 않습니다.

/Type/ { type=$2; types[$2] = 1 }
!/Type/ { data[type,$1] = $2; keys[$1] = 1 }
END {
    m = asorti(types)
    value = "Type"
    for (i = 1; i <= m; i++) {
        value = value "," types[i];
    }
    print value;
    n = asorti(keys)
    for (i = 1; i <= n; i++) {
        value=keys[i]
        for (k = 1; k <= m; k++) {
            value = value "," data[types[k],keys[i]]
        }
        print value;
    }
}

그러나 awk정렬 기능을 위해서는 여전히 GNU가 필요합니다.

관련 정보