[英]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.