【问题标题】:Change last record separator with awk使用 awk 更改最后一条记录分隔符
【发布时间】:2018-12-30 12:06:33
【问题描述】:

我有一个输入文件如下:

apple 6
banana 7
goat 8

我需要输出为

{6,apple},
{7,banana},
{8,goat}

但是,当我如下运行 awk 时,它会打印额外的最后一个逗号 (,)。如何避免最后一个逗号?

awk '{print "{"$2","$1"},"}' data
{6,apple},
{7,banana},
{8,goat},

更新

其实我需要这样的输出

{6,apple},
{7,banana},
{8,goat}
] 

当我跑步时

awk '{print "{"$2","$1"},"}' END {print "\t\t]\n}' data

它给了我

{6,apple},
{7,banana},
{8,goat}, 
] 

我不需要最后一个逗号...在这种情况下如何避免?

【问题讨论】:

标签: bash awk


【解决方案1】:

使用以下命令行将其传递到sed 怎么样?

awk ... | sed '$ s/,$//' 

【讨论】:

  • @ChristianGibbons:不,不会。
【解决方案2】:

使用printf 和延迟 printf 的逗号:

$ awk '{printf "%s{%s,%s}",(NR==1?"":"," ORS),$2,$1} END{print ORS "]"}' file
{6,apple},
{7,banana},
{8,goat}
]

【讨论】:

    【解决方案3】:

    这是另一种选择

    $ awk 'NR==FNR{n=NR; next} {print "{" $2 "," $1 "}" (FNR==n?"\n]":",")}' file{,}
    
    {6,apple},
    {7,banana},
    {8,goat}
    ]
    

    【讨论】:

      【解决方案4】:

      只是延迟输出:

      awk 'NR>1{print lastline} {lastline="{" $2 "," $1 "},"; } END{print substr(lastline, 1, length(lastline)-1)}' data
      

      每行打印最后一行的输出,最后去掉最后一个逗号并打印。

      【讨论】:

        【解决方案5】:
        awk 'BEGIN{ORS=",\n"} {if (NR>1) {print prev} prev="{"$2","$1"}"} END{ORS=""; print prev}'
        

        【讨论】:

          【解决方案6】:

          这里是 Perl 解决方案

          /tmp> cat media.txt
          apple 6
          banana 7
          goat 8
          /tmp> perl -lne ' s/(\S+) (\d+)/{$2,$1}/g; if(eof) { print "$_\n]" } else { print "$_," } ' media.txt
          {6,apple},
          {7,banana},
          {8,goat}
          ]
          /tmp>
          

          或者

          $ perl -lne ' s/(\S+) (\d+)/{$2,$1}/g; print eof ? "$_\n]" : "$_," ' media.txt
          {6,apple},
          {7,banana},
          {8,goat}
          ]
          

          如果您的文件可以放入内存,则下面的 Perl 解决方案可以工作

          /tmp> perl -0777 -ne ' s/(\S+) (\d+)/{$2,$1}/g ; print join(",\n",split)."\n]\n" ' media.txt
          {6,apple},
          {7,banana},
          {8,goat}
          ]
          /tmp>
          

          【讨论】:

            猜你喜欢
            • 2016-04-13
            • 1970-01-01
            • 1970-01-01
            • 2012-08-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多