【问题标题】:UNIX - Rows to Column Conversion [duplicate]UNIX - 行到列的转换 [重复]
【发布时间】:2017-01-30 13:19:20
【问题描述】:

我有一个数据集:

<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' ',' &lt; file.txt &gt; &gt; Output.txt

这在一行中为我提供了整个输出。我试图用 \n 替换“START”字符串以将值放入行中。但是我的笔记本电脑内存不足。

任何使用 awk 或 sed 的最佳解决方案?

【问题讨论】:

    标签: unix text awk sed tr


    【解决方案1】:

    这将以随机顺序打印列,因为 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"] 控制输出顺序(参见手册页)。

    【讨论】:

    • 谢谢@Ed Morton 我在输出中得到一个空白文件...有什么建议吗?
    • 编辑您的问题以显示输入文件和您正在运行的命令。正如您所看到的,我发布的命令确实会根据您提供的输入文件产生显示的输出,因此您必须运行不同的命令或针对与您发布的内容不同的输入运行相同的命令。如果您希望我们帮助您进行调试,请确保将您在终端中所做的操作准确复制/粘贴到 SO 编辑器中。
    • 抱歉耽搁了,“col1=value”字符串前有一个缩进,值以分号结尾。我已经更新了问题。
    • 我也很抱歉,但我对每周重新讨论一次这个问题不感兴趣。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 2015-01-18
    • 1970-01-01
    • 2014-09-08
    • 2013-09-30
    • 2021-07-02
    • 2011-12-20
    • 2013-10-01
    相关资源
    最近更新 更多