【发布时间】:2019-10-08 01:12:13
【问题描述】:
我有如下 csv 文件:
C1, C2, C3,Cv1,Cv2,Cv3,Cv4 ... this one can be have longer column
x1, x2 ,x3.1, 1.1, 1.2, 1.3, 1.4
x1, x2, x3.2, 2.1, 2.2, 2.3, 2.4
x1, x2, x3.3, 3.1, 3.2, 3.3, 3.4
我想将此 csv 文件转换为如下:
C1,C2, C3,CTEXT,XVALUE
x1, x2, x3.1, Cv1 , 1.1
x1, x2, x3.1, Cv2 , 1.2
x1, x2, x3.1, Cv3 , 1.3
x1, x2, x3.1, Cv4 , 1.4
x1, x2, x3.2, Cv1 , 2.1
x1, x2, x3.2, Cv2 , 2.2
x1, x2, x3.2, Cv3 , 2.3
x1, x2, x3.2, Cv4 , 2.4
x1, x2, x3.3, Cv1 , 3.1
x1,x2,x3.3, Cv2 , 3.2
x1,x2,x3.3, Cv3 , 3.3
x1,x2,x3.3, Cv4 , 3.4
下面是我的代码:
#!/bin/bash
awk -F, -v OFS=, '{ if (NR==1)
{ print $1,$2,$3, "CTEXT","XVALUE"
i=4; while (i < NF) {
a[i]=$i; i=i+1
}
am=NF; next
}
i=4 ; while (i < am) {
if (i > NF) {print "record "NR" insufficient value" >/dev/stderr
break}
print $1,$2,$3,a[i],$i
i=i+1
}
if (am <NF) print "record "NR" too many values for text" >/dev/stderr
}' input.csv
当我运行脚本时,它显示错误:
awk:第 2 行附近的语法错误 awk:在 2 号线附近救援
由 Ed Morton 编辑 - 我刚刚通过美化器 (gawk -o- '...') 运行脚本,因此更容易阅读/理解:
{
if (NR == 1) {
print $1, $2, $3, "CTEXT", "XVALUE"
i = 4
while (i < NF) {
a[i] = $i
i = i + 1
}
am = NF
next
}
i = 4
while (i < am) {
if (i > NF) {
print("record " NR " insufficient value") > (/dev/) stderr
break
}
print $1, $2, $3, a[i], $i
i = i + 1
}
if (am < NF) {
print("record " NR " too many values for text") > (/dev/) stderr
}
}
【问题讨论】:
-
@Amadan Pivot 与转置不同。
-
@Barmar:是的。我的错。我没有注意到数据,认为标题是正确的。
-
这看起来像一个旧的 awk 错误消息。试试
nawk,或gawk或/usr/xpg4/bin/awk。 (编辑您的 Q 以显示uname -srv的输出)。祝你好运。 -
请选择一种通用的代码格式并将其用于您的脚本。您现在拥有的某些行上有多个语句和随意的缩进会使您的脚本不必要地难以理解。此外 - awk 支持
for循环,因此您可以编写类似for (i=4; i<NF; i++) { foo }的语句,而不是i=4; while (i<NF) { foo; i = i + 1 }