Сопоставьте N строк между символами, переместите N строк, чтобы они были в линию с шаблоном - PullRequest
1 голос
/ 29 марта 2019

Я анализирую таблицу википедии.Таблица содержит следующие данные:

Tonga
0
Trinidad and Tobago
10
14
24
Tunisia
10
6
16
Turkey
12
14.5
26.5

Я хотел бы иметь регулярное выражение (исполняемое в терминале, предпочтительно sed или аналогичное), которое перемещает произвольное число N строк чисел в указанное выше название страны AZ * 1004.*

Ожидаемый результат:

Tonga,0
Trinidad and Tobago,10,14,24
Tunisia,10,6,16
Turkey,12,26.5

Я не приблизился, вот мои лучшие усилия.Ваш ум приветствуется,К сожалению, я не знаю, возможно ли сопоставить \n с sed / perl

Я пытался tr, но опять же я не знаю, как сохранить соответствие на выходе.Он заменяет все символы на

tr 'A-z\n' ','

Производит ,,,,,,0,,,,,,,,, ,,, ,,,,,,,10,14,24,,,,,,,,,10,6,16,,,,,,,,12,14.5,26.5,

Ответы [ 5 ]

4 голосов
/ 29 марта 2019
$ awk '{printf "%s%s", (/^[0-9]/ ? "," : s), $0; s=ORS} END{print ""}' file
Tonga,0
Trinidad and Tobago,10,14,24
Tunisia,10,6,16
Turkey,12,14.5,26.5
2 голосов
/ 29 марта 2019

И решение sed:

sed -n -e '/[a-zA-Z]/{' -e 'x;/./s/\n/,/gp;x;h;}' -e '/^[0-9][0-9.]*$/H;${' -e 'x;/./s/\n/,/gp;}' file

Идея состоит в том, чтобы сохранить каждую деталь в удерживающем пространстве, а затем отключить и заменить \n на , s и напечатать.

2 голосов
/ 29 марта 2019

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

awk 'BEGIN{OFS=","}/^[a-zA-Z]+/ && val{print val;val=""} {val=val?val OFS $0:$0} END{if(val){print val}}'  Input_file

Пояснение:

awk '
BEGIN{                      ##Starting BEGIN section here.
  OFS=","                   ##Setting output field seprator as comma here.
}
/^[a-zA-Z]+/ && val{        ##Checking condition if a line starts with alphabet and variable val is not null.
  print val                 ##Printing variable val here.
  val=""
}
{
  val=(val?val OFS:"")$0    ##Creating variable val and concatenating its value to its own for each line value.
}
END{                        ##Starting END block for this awk code.
  if(val){                  ##Checking if val is NOT NULL.
    print val               ##Then printing val here.
  }
}'  Input_file              ##Mentioning Input_file name here.
1 голос
/ 29 марта 2019

Другое awk решение:

awk '/[a-zA-Z]/{if(FNR>1)print "";printf "%s",$0} $0+0==$0{printf ",%s",$0} END{print ""}' file
0 голосов
/ 06 апреля 2019

на Perl 5, ваши данные в «таблице»;

$  perl -lpe 'BEGIN{undef $/} s/\n(?!$)/,/g; s/(?<=\d),([a-z])/\n$1/ig' table

или

$ perl -lpe 'BEGIN{undef $/} s/\n/,/g; s/([a-z ]+(,[\d.]+)*),/$1\n/ig' table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...