SED найти и заменить текст с помощью SED или AWK? - PullRequest
0 голосов
/ 25 февраля 2019

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

DE
  RDT;136618;0.0%;100.0%
  RD;7379;97.8%;2.2%
IT
  RDT;69424;97.0%;3.0%
  RD;585;98.7%;0.0%
FR
  RDT;22870;96.5%;3.5%
  RD;440;98.8%;0.0%
UK
  RDT;33167;97.7%;2.3%
  RD;438;97.3%;0.1%
ES
  RDT;99860;96.9%;3.1%
  RD;391;97.9%;0.1%

RDTDE;136618;0.0%;100.0%
RDDE;7379;97.8%;2.2%
RDTIT;69424;97.0%;3.0%
RDIT;585;98.7%;0.0%
RDTFR;22870;96.5%;3.5%
RDFR;440;98.8%;0.0%
RDTUK;33167;97.7%;2.3%
RDUK;438;97.3%;0.1%
RDTUK;99860;96.9%;3.1%
RDUK;391;97.9%;0.1%

Я хочу объединить код, вводя его в один шаг или в несколько шагов.В нескольких было бы лучше, тогда я могу понять, что здесь сделано.

Ответы [ 5 ]

0 голосов
/ 25 февраля 2019

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

sed -nE '/^\S/h;G;s/^\s+([^;]*)(.*)\n(.*)/\1\3\2/p' file

Сохранить идентификаторы округов в области удержания.Добавьте пространство удержания к другим строкам и, используя сопоставление с образцом, добьетесь требуемого результата.

0 голосов
/ 25 февраля 2019

еще awk

$ awk -F';' 'NF==1{s=$1;next} {sub(";",s ";"); sub(" +","")}1' file

RDTDE;136618;0.0%;100.0%
RDDE;7379;97.8%;2.2%
RDTIT;69424;97.0%;3.0%
RDIT;585;98.7%;0.0%
RDTFR;22870;96.5%;3.5%
RDFR;440;98.8%;0.0%
RDTUK;33167;97.7%;2.3%
RDUK;438;97.3%;0.1%
RDTES;99860;96.9%;3.1%
RDES;391;97.9%;0.1%
0 голосов
/ 25 февраля 2019
 $ awk 'BEGIN {OFS=FS=";"} NF == 1 {country = $1; next} {$1 = $1 country}1' file
  RDTDE;136618;0.0%;100.0%
  RDDE;7379;97.8%;2.2%
  RDTIT;69424;97.0%;3.0%
  RDIT;585;98.7%;0.0%
  RDTFR;22870;96.5%;3.5%
  RDFR;440;98.8%;0.0%
  RDTUK;33167;97.7%;2.3%
  RDUK;438;97.3%;0.1%
  RDTES;99860;96.9%;3.1%
  RDES;391;97.9%;0.1%
0 голосов
/ 25 февраля 2019

Другой awk, более совместимый:

awk '/^[A-Z]*$/{cc=$0;next}sub(/^ +/,"")+sub(";",cc ";")' file
RDTDE;136618;0.0%;100.0%
RDDE;7379;97.8%;2.2%
RDTIT;69424;97.0%;3.0%
RDIT;585;98.7%;0.0%
RDTFR;22870;96.5%;3.5%
RDFR;440;98.8%;0.0%
RDTUK;33167;97.7%;2.3%
RDUK;438;97.3%;0.1%
RDTES;99860;96.9%;3.1%
RDES;391;97.9%;0.1%

Если не нужно удалять начальные пробелы, вы можете удалить sub(/^ +/,"")+ эту часть.

Если у вас есть GNUawk, то можете сделать это так:

awk '/^[A-Z]{2}$/{cc=$0;next}{print gensub(/^\s*([^\s;]+)/, "\\1" cc, 1)}' file
0 голосов
/ 25 февраля 2019

Не могли бы вы попробовать следующее (проверено только на предоставленных образцах).

awk 'BEGIN{OFS=FS=";"}!/^ /{val=$0;next} val{sub(/^ +/,"");$1=$1 val} val' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...