簡體   English   中英

用awk更改最后一個記錄分隔符

[英]Change last record separator with awk

我有一個輸入文件如下:

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}, 
] 

我不需要最后一個逗號......在這種情況下如何避免?

如何使用以下命令行將其連接到sed

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

使用逗號的printf和delayed printf:

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

這是另一種選擇

$ awk 'NR==FNR{n=NR; next} {print "{" $2 "," $1 "}" (FNR==n?"\n]":",")}' file{,}

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

只是延遲輸出:

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

每行打印最后一行的輸出,最后一行最后一個逗號並打印出來。

awk 'BEGIN{ORS=",\n"} {if (NR>1) {print prev} prev="{"$2","$1"}"} END{ORS=""; print prev}'

這是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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM