UNIX - 行到列转换

时间:2016-09-22 05:32:46

标签: unix text awk sed tr

我有一个数据集:

<START
   col1=value;
   col2=value;
   col3=value;
   col4=value;
   col5=value;
<END
<START
  col1=value;
  col2=value;
  col4=value;
<END
<START
  col1=value;
  col2=value;
  col3=value;
  col4=value;
  col6=value;
<END

我希望输出为

col1|col2|col3|col4|col5|col6
value|value|value|value|value|value
value|value|null|value|null|null
value|value|value|value|null|value

我正在使用tr -s '\n' ',' < file.txt > > Output.txt

这使我可以在一行中输出整个输出。我试图取代&#34; START&#34;使用\ n的字符串将值转换为行。但是我的笔记本电脑内存不足。

使用awk或sed解决此问题的最佳方案是什么?

1 个答案:

答案 0 :(得分:0)

这将按随机顺序打印列,因为idk你想要什么样的顺序(先进入,字母,其他?):

$ cat tst.awk
BEGIN { FS="="; OFS="|" }
NR==FNR { if (!/^</) names[$1]; next }
FNR==1  {
    numNames = length(names)
    nameCnt = 0
    for (name in names) {
        printf "%s%s", name, (++nameCnt<numNames ? OFS : ORS)
    }
}
/^<END/ {
    nameCnt = 0
    for (name in names) {
        printf "%s%s", (name in vals ? vals[name] : "null"), (++nameCnt<numNames ? OFS : ORS)
    }
    delete vals
    next
}
{ vals[$1] = $2 }

$ awk -f tst.awk file file
col1|col2|col3|col4|col5|col6
value|value|value|value|value|null
value|value|null|value|null|null
value|value|value|value|null|value

使用GNU awk 4. *您可以使用PROCINFO["sorted_in"]控制输出顺序(参见手册页)。