답변1
이것이 당신에게 얼마나 도움이 되는지 확인해 보세요
awk -F\; '
{TMP = ""
for (i=1; i<=NF; i++) if ($i == "") TMP = sprintf ("%s,%c", TMP, 64+i)
print substr (TMP,2)
}
' /test1.csv
B,F,H
A,G,H
A,C,F
필요한 경우 필드 구분 기호를 조정합니다. 26열 이후에는 실패합니다.
새로운 요구 사항에 적응
awk -F\; '
NR == 1 {MX = split ($0, HDR)
next
}
{TMP = ""
for (i=1; i<=MX; i++) if ($i == "") TMP = sprintf ("%s,%s", TMP, HDR[i])
print substr (TMP,2)
}
' file
banana
rachel
banana
rachel,monica,chandler,joey,janice,banana
rachel,monica,chandler,joey,banana
답변2
나는 당신이 다음과 같은 것을 찾고 있다고 생각합니다
awk '
BEGIN { FS=";" }
NR==1 {
for(i = 1; i <= NF; i++) { heads[i]=$i; }
}
{ for(i = 1; i <= NF; i++) {
if ($i == "") { printf "%s ",heads[i] }
}
print "";
}
'
이렇게 하면 첫 번째 행의 필드가 배열로 분리됩니다 heads
. 첫 번째 행이 아닌 각 행에 대해 awk는 열을 반복하고 열 이름을 인쇄합니다(필드가 비어 있는 경우). 하지만 테스트할 시간은 없습니다. 오류가 있을 수 있습니다. 청소년MMV
답변3
또한 다음을 시도해보세요:
BEGIN {FS=OFS=","}
{
if (NR == 1)
split($0, hdr)
if (nr) {nr = 0; print("")}
for(f=1; f<=NF; f++)
if ($f == "") {
if (!nr)
printf("%s", hdr[f])
else
printf("%c%s", OFS, hdr[f])
nr = 1
}
}
음, 특별한 BANANA 열 구현은 다음과 같습니다.
BEGIN {FS = OFS = ","}
NR == 1 {
printf("%s%c%s\n", $0, OFS, "BANANA")
split($0, hdr)
next
}
{
for(f = 1; f <= NF; f++)
if ($f == "") {
printf("%s%c%s\n", $0, OFS, hdr[f])
break
}
}