내 디렉토리에는 다른 이름을 가진 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입니다. gawk
GNU 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가 필요합니다.