Изменить разделитель последней записи с помощью awk - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть входной файл, как показано ниже:

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

Мне не нужна последняя запятая ... Как этого избежать в этом случае?

Ответы [ 6 ]

0 голосов
/ 25 декабря 2018
awk 'BEGIN{ORS=",\n"} {if (NR>1) {print prev} prev="{"$2","$1"}"} END{ORS=""; print prev}'
0 голосов
/ 24 декабря 2018

Вот решение 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>
0 голосов
/ 23 декабря 2018

Использование printf и отложенная печать через запятую:

$ awk '{printf "%s{%s,%s}",(NR==1?"":"," ORS),$2,$1} END{print ORS "]"}' file
{6,apple},
{7,banana},
{8,goat}
]
0 голосов
/ 23 декабря 2018

Просто задержите вывод:

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

в каждой строке выведите вывод последней строки, в конце запятой последнюю запятую и напечатайте его.

0 голосов
/ 23 декабря 2018

вот одна альтернатива

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

{6,apple},
{7,banana},
{8,goat}
]
0 голосов
/ 23 декабря 2018

Как насчет передачи его на sed с помощью следующей командной строки?

awk ... | sed '$ s/,$//' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...