Как присоединить каждую строку новой строки в одинарные или двойные кавычки - PullRequest
0 голосов
/ 23 апреля 2020

Как объединить каждую строку новой строки в одинарные или двойные кавычки, разделенные запятой.

Пример:

У меня есть имена ниже.

$ cat file

James kurt
Suji sane
Bhujji La
Loki Hapa

Желаемый:

"James kurt", "Suji sane", "Bhujji La", "Loki Hapa"

РЕДАКТИРОВАТЬ:

Мои побочные усилия:

Ниже, что я сделал, но там я завершаю его в два этапа, просто любопытно, если он может быть забит в только один.

 $ awk '{print "\x22" $1" "$2 "\x22"}'| tr '\n' ','

Ответы [ 4 ]

2 голосов
/ 23 апреля 2020

Сначала выведите все строки с помощью ", а затем соедините строки запятой:

< file xargs -d '\n' printf '"%s"\n' | paste -sd,

Вместо новой строки вы можете просто удалить конечный (или начальную запятую):

< file xargs -d '\n' printf '"%s",' | sed 's/,$//'
< file xargs -d '\n' printf ',"%s"' | cut -c2-
< file xargs -d '\n' printf ', "%s"' | cut -c3-   # with space after comma

С помощью sed добавьте " и удерживайте строки, затем в последней строке замените символ новой строки запятой, удалите ведущую команду и напечатайте:

sed -n 's/^/"/;s/$/"/;H;${x;s/\n/, /g;s/^, //;p}' file

Вы были близки! " " в вашей попытке добавляет пробел между строкой и ". Вы можете:

awk '{print "\x22" $0 "\x22"}' | tr '\n' ',' |
# and then remove trailing comma:
sed 's/,$//'

Но объединить строки с помощью paste проще, чем заменить символы новой строки запятой и удалить последнюю:

awk '{print "\x22" $0 "\x22"}' | paste -sd,
1 голос
/ 23 апреля 2020

Это может работать для вас (GNU sed):

sed ':a;N;$!ba;s/.*/"&"/mg;s/\n/, /g' file

Перетаскивать файл в пространство шаблона, заключать строки в двойные кавычки и заменять строки на запятые и пробелы.

Альтернатива:

sed -z 's/\n$//;s/.*/"&"/mg;s/\n/, /g;s/$/\n/' file
1 голос
/ 23 апреля 2020
awk '{printf "%s",(NR==1?"":",")"\042"$0"\042"}END{print ""}'

Обратите внимание, что последний оператор END используется только для добавления последней новой строки к выводу. Это делает это жалобой POSIX.

1 голос
/ 23 апреля 2020

Не могли бы вы попробовать следующее.

awk -v lines=$(wc -l < Input_file) -v s1="\"" '
BEGIN{
  OFS=", "
}
{
  printf("%s%s",s1 $0 s1,lines==FNR?ORS:OFS)
}
'  Input_file

Объяснение: Добавление подробного объяснения выше.

awk -v lines=$(wc -l < Input_file) -v s1="\"" '   ##Starting awk program, creating variable lines which has total number of lines in Input_file and creating s1 variable with " in it.
BEGIN{                                            ##Starting BEGIN section of this program from here.
  OFS=", "                                        ##Setting OFS value as comma space here.
}
{
  printf("%s%s",s1 $0 s1,lines==FNR?ORS:OFS)      ##Printing current line and either printing space or new line as per condition.
}
'  Input_file                                     ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...