【问题标题】:How to Format ouput file using awk如何使用 awk 格式化输出文件
【发布时间】:2018-06-03 02:01:10
【问题描述】:

我有以下格式的 shell 脚本输出文件

data  text1

data1 text2

data3 text4,text5,text6,text7,text8,text9,text10,text12,text11,text13

data4 text53

data23 text45,text65,text98,text65`

想要进一步改变输出的格式,如下所示,以提高可读性

data   text1

data1  text2

data3  text4

data3  text5

data3  text6

data3  text7

data3  text8

data3  text9

data3  text10

data4  text53

data23 text45

data23 text65

data23 text98

data23 text65

请告知如何使用 awk/sed 来达到同样的效果? 尝试查找 awk 命令但没有得到任何线索,任何帮助将不胜感激 谢谢

【问题讨论】:

  • 真的在每个输入行之间有一个空行并且希望在输出中保持相同吗?
  • 你好 @ed 我真的不需要输出之间的空白行,但考虑到它将有大量记录,让它更具可读性会很好

标签: shell awk


【解决方案1】:
$ awk -F'[ ,]+' '{for (i=2;i<=NF;i++) print $1, $i ORS}' file
data text1

data1 text2

data3 text4

data3 text5

data3 text6

data3 text7

data3 text8

data3 text9

data3 text10

data3 text12

data3 text11

data3 text13

data4 text53

data23 text45

data23 text65

data23 text98

data23 text65

【讨论】:

    【解决方案2】:

    你可以这样使用:

    output | gawk '{split($2, a, /,/); for (i=1; i <= length(a); i++) {printf "%s %s\n\n", $1, a[i]}}'
    

    output 是您的脚本生成的输出。

    或者,您可以像这样运行它:

    gawk '{split($2, a, /,/); for (i=1; i <= length(a); i++) {printf "%s %s\n\n", $1, a[i]}}' output_file
    

    编辑以修复@Ed Morton 指出的错误,并将awk 替换为gawk,因为length(array) 是一个GNU 扩展。

    【讨论】:

    • 感谢@accdias .. 我一直在查找手册页,但仍试图了解如何为下面的行 data3 text4,text5,text6,text7,text8,text9,text10,text12,text11,text13 分配 '$2' 在 FS "," 之后给出的行将被拆分换行
    • $1 == "data3"$2 == "text4,text5,text6,text7,text8,text9,text10,text12,text11,text13"。然后split($2, a, ",") 将填充数组a,每个值$2 以逗号分隔。
    • 在这种情况下,您的任何 cmets 都会有所不同。
    • 你迟到了 12 个半小时。
    • 别担心,我为我的不良行为道歉。非常欢迎您的 cmets,@Ed Morton。
    【解决方案3】:

    另一个使用gsub,

    $ awk '{gsub(/,/, ORS ORS $1 OFS )}1' file
    ...
    data3 text4
    
    data3 text5
    
    data3 text6
    ...
    

    但是,如果$1 中包含&amp;,则会出现问题,因为它会被匹配替换:

    $ cat file
    data& text4,text5,text6
    $ awk '{gsub(/,/, ORS ORS $1 OFS )}1' file
    data& text4
    
    data, text5
    
    data, text6
    

    用另一个 gsub 解决这个问题:

    $ awk '{gsub(/,/, ORS ORS $1 OFS ); gsub(/,/,"\\&")}1' file
    data& text4
    
    data& text5
    
    data& text6
    

    【讨论】:

      【解决方案4】:

      你可以一次折叠一条线

      sed -r 's/([^ ]* +)([^,]*),(.*)/\1\2\n\n\1\3/g' file
      

      重复它需要一个标记一个跳转

      sed -r ': a;s/([^ ]* +)([^,]*),(.*)/\1\2\n\n\1\3/g; t a' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-06
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-29
        相关资源
        最近更新 更多