【问题标题】:Pivoting a text file旋转文本文件
【发布时间】:2019-08-22 04:35:30
【问题描述】:

给定一个数据文件,我想使用 awk 将某些列转置为行。

输入数据文件每个月有一列,像这样:

FirstName|LastName|Jan|Feb|Mar
First_1|Last_1|1|10|100
First_2|Last_2|2|20|200
First_3|Last_3|3|30|300

我想保留前两列,并将月份转换为行。我的预期输出是:

First_1|Last_1|Jan|1
First_1|Last_1|Feb|10
First_1|Last_1|Mar|100
First_2|Last_2|Jan|2
First_2|Last_2|Feb|20
First_2|Last_2|Mar|200
First_3|Last_3|Jan|3
First_3|Last_3|Feb|30
First_3|Last_3|Mar|300

我试过了

awk -F'|' 'NR>1 {{OFS="|"} {for (i=3; i<=NF; i++) {print $1,$2,$i}}}' input_file

这给了我几乎想要的输出:

First_1|Last_1|1
First_1|Last_1|10
First_1|Last_1|100
First_2|Last_2|2
First_2|Last_2|20
First_2|Last_2|200
First_3|Last_3|3
First_3|Last_3|30
First_3|Last_3|300

但我无法添加月份列。我试过这个:

awk -F'|' 'NR>1 {{OFS="|"} {for (i=3; i<=NF; i++) {print $1,$2,NR==1 {print $i}},$i}}}' input_file

但我得到一个语法错误。

【问题讨论】:

  • 在 SO 上,我们确实鼓励人们为解决自己的问题而付出努力。请添加相同的内容,然后让我们知道。

标签: shell unix awk sed


【解决方案1】:

试试这个脚本:

awk -F'|' 'NR>0 {{OFS="|"} {if (NR==1) {for (i=3; i<=NF; i++) {x[i-3]=$i;}} else {for (i=3; i<=NF; i++) {print $1,$2,x[i-3],$i }}}}' input_file

上面的脚本在解析第一行 NR==1 时,使用 for 循环 (for (i=3; i&lt;=NF; i++) {x[i-3]=$i;}) 将月份复制到数组 x 中。稍后,循环变量i 使用该数组作为索引来获取正确的月份值(x[i-3])。

对您的脚本进行了两项更改:

1) 添加了以下部分,用于提取月份名称并将其存储到数组中。

if (NR==1) {for (i=3; i<=NF; i++) {x[i-3]=$i;}

2) 然后将数组添加到打印语句中。

print $1,$2,x[i-3],$i

结果:

First_1|Last_1|Jan|1
First_1|Last_1|Feb|10
First_1|Last_1|Mar|100
First_2|Last_2|Jan|2
First_2|Last_2|Feb|20
First_2|Last_2|Mar|200
First_3|Last_3|Jan|3
First_3|Last_3|Feb|30
First_3|Last_3|Mar|300

【讨论】:

    【解决方案2】:
    $ awk 'BEGIN { FS=OFS="|" }
           NR==1 { print "FirstName|LastName|Month|Value"
                   for (n = 3; n <= NF; n++) months[n] = $n
                   next }
           { for (n = 3; n <= NF; n++) print $1, $2, months[n], $n }' input.txt
    FirstName|LastName|Month|Value
    First_1|Last_1|Jan|1
    First_1|Last_1|Feb|2
    First_1|Last_1|Mar|3
    First_2|Last_2|Jan|2
    First_2|Last_2|Feb|4
    First_2|Last_2|Mar|6
    First_3|Last_3|Jan|3
    First_3|Last_3|Feb|6
    First_3|Last_3|Mar|9
    

    【讨论】:

      猜你喜欢
      • 2013-08-16
      • 2021-05-11
      • 2013-05-18
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多