awk:将列标题转置为行的第一个字段

时间:2016-11-24 21:56:26

标签: awk transpose

我的输入如下:

A|B|C
1|2|3
4|5|6

使用awk,我想得到:

A|1
B|2
C|3
A|4
B|5
C|6

我的代码:

gawk '
BEGIN{FS=OFS="|"}
NR==1{
    for(i=1; i<=NF; i++){
        x_i=$i
    }
}
NR>1{
    for(i=1; i<=NF; i++){
        print x_i FS $i
    }
}' input  

但它只保留NR==1块的最后一次迭代,即使我在NR>1 bock中使用相同的循环:

C|1
C|2
C|3
C|4
C|5
C|6

任何技巧?

修改

感谢Jose,我需要x_i更改x[i]

如果使用相同的输入,我需要输出:

A;B;C|1|2|3
A;B;C|4|5|6

3 个答案:

答案 0 :(得分:1)

$ awk 'BEGIN{FS=OFS="|"} NR==1{split($0,h);next} {for (i=1;i<=NF;i++) print h[i], $i}' file
A|1
B|2
C|3
A|4
B|5
C|6

$ awk 'BEGIN{FS=OFS="|"} NR==1{gsub(/\|/,";");h=$0;next} {print h, $0}' file
A;B;C|1|2|3
A;B;C|4|5|6

阅读有效的Awk编程,第4版,作者Arnold Robbins。

答案 1 :(得分:0)

你可以尝试,

awk 'BEGIN{FS=OFS="|"}
     NR==1{for(i=1; i<=NF; ++i) d[i]=$i; next}
     {for(i=1; i<=NF; ++i) print d[i], $i}
' input

你得到了

A|1
B|2
C|3
A|4
B|5
C|6

重要提示

您的逻辑是正确的,只有x[i]而不是x_i

gawk '
BEGIN{FS=OFS="|"}
NR==1{
    for(i=1; i<=NF; i++){
        x[i]=$i
    }
}
NR>1{
    for(i=1; i<=NF; i++){
        print x[i] FS $i
    }
}' input

答案 2 :(得分:0)

使用for$ awk 'NR==1 { split($0,a,"|") } NR>1 { n=split($0,b,"|"); for(i=1;i<=n;i++) print a[i] "|" b[i] }' file A|1 B|2 C|3 A|4 B|5 C|6

是另一个

fixed_toFixed = (value, prec) => Math.abs(value) < Math.pow(10, -prec) ? (0).toFixed(prec) : value.toFixed(prec);