我需要脚本遍历每一列并检查空白,并将其分组为1列.例如第一排:香蕉,第二排<>瑞秋,第5排:rachel,莫妮卡,钱德勒,乔伊,珍妮丝,香蕉
发布于 2018-08-07 10:11:34
看看这能让你走多远
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
发布于 2018-08-07 11:27:09
也试试这个:
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
}
}
下面是一个特殊的香蕉列实现:
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
}
}
发布于 2018-08-07 12:45:33
我想你是在寻找一种类似于
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将遍历这些列并打印列名。但是没有时间去测试。可能含有臭虫。YMMV
https://unix.stackexchange.com/questions/461009
复制相似问题