SED查找并用SED或AWK替换文本?

时间:2019-02-25 13:18:31

标签: csv awk sed

我想在这里整个早上做第一个。 但是我无法前进,有人可以帮助我吗?

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 :(得分:1)

 $ 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%

答案 1 :(得分:1)

这可能对您有用(GNU sed):

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

将县ID保存到保留空间。将保留空间附加到其他行,并使用模式匹配获得所需的结果。

答案 2 :(得分:0)

请尝试以下方法(仅在提供的样品上测试过)。

awk 'BEGIN{OFS=FS=";"}!/^ /{val=$0;next} val{sub(/^ +/,"");$1=$1 val} val' Input_file

答案 3 :(得分:0)

另一个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(/^ +/,"")+这部分。

如果您有GNU awk,则可以这样做:

awk '/^[A-Z]{2}$/{cc=$0;next}{print gensub(/^\s*([^\s;]+)/, "\\1" cc, 1)}' file

答案 4 :(得分:0)

另一个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%