regex 如何在相关列中移动小数点(sed)

ioekq8ef  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(112)

我的任务是创建一个名为script.sed的脚本,它必须设置以下条件:

  • 擦除前两列(已经在下面的代码中实现)
  • 擦除“频率”列中带有0的行(在下面的代码中已经实现)
  • 保持字段的标题不被修改,擦除以前擦除的列的标题,并将列的名称“freq_prop_headlines”更改为“%_headlines”(在下面的代码中已经实现)
  • freq_prop_headlines的小数点向后移动两位以获得百分比而不是百分比,保留所有数字并删除小数点前任何不必要的零。一些记录采用科学记数法(全部提升到-5),它们也必须被处理,以十进制记数法显示。(执行部分注:例如,如果有一个像0.000814664这样的数字,它必须变成0.0814664)

因此,我只剩下最后一点要解决。
我必须使用的CSV文件名为headlines_words.csv,它的前10行是:

Unnamed: 0;Unnamed: 0.1;year;country;word;frequency;count;freq_prop_headlines;word_len;freq_rank;hfreq_rank;theme
12;277;2010;India;cricketer;0;1584;0.0;9;20;20;empowerment
13;278;2011;India;cricketer;0;2438;0.0;9;20;20;empowerment
14;279;2012;India;cricketer;0;3634;0.0;9;20;20;empowerment
15;280;2013;India;cricketer;4;4910;0.000814664;9;20;20;empowerment
16;281;2014;India;cricketer;6;7502;0.0007997869999999;9;20;20;empowerment
17;282;2015;India;cricketer;11;10532;0.001044436;9;20;20;empowerment
18;283;2016;India;cricketer;14;14012;0.000999144;9;20;20;empowerment
19;284;2017;India;cricketer;48;17097;0.00280751;9;20;20;empowerment
20;285;2018;India;cricketer;40;19170;0.002086594;9;20;20;empowerment
21;286;2019;India;cricketer;66;20849;0.003165619;9;20;20;empowerment

我已经得到的script.sed的代码是:

# Erase the two first columns:
s/^[^;]*;[^;]*;//

# Erase all rows with count 0 in the frequency column
/^.*;0;/d

# Rename freq_prop_headlines to %_headlines
s/freq_prop_headlines/%_headlines/

# Show the first 10 rows (to ease the code checking by the output)
10q

我必须运行下面的命令(它是语句强制性的):

sed -f script.sed headlines_words.csv

一旦运行我的代码,我得到了这个:

year;country;word;frequency;count;%_headlines;word_len;freq_rank;hfreq_rank;theme
2013;India;cricketer;4;4910;0.000814664;9;20;20;empowerment
2014;India;cricketer;6;7502;0.0007997869999999;9;20;20;empowerment
2015;India;cricketer;11;10532;0.001044436;9;20;20;empowerment
2016;India;cricketer;14;14012;0.000999144;9;20;20;empowerment
2017;India;cricketer;48;17097;0.00280751;9;20;20;empowerment
2018;India;cricketer;40;19170;0.002086594;9;20;20;empowerment

预期输出必须为:

year;country;word;frequency;count;%_headlines;word_len;freq_rank;hfreq_rank;theme
2013;India;cricketer;4;4910;0.0814664;9;20;20;empowerment
2014;India;cricketer;6;7502;0.07997869999999;9;20;20;empowerment
2015;India;cricketer;11;10532;0.1044436;9;20;20;empowerment
2016;India;cricketer;14;14012;0.0999144;9;20;20;empowerment
2017;India;cricketer;48;17097;0.280751;9;20;20;empowerment
2018;India;cricketer;40;19170;0.2086594;9;20;20;empowerment

现在我如何设置语句的最后一个条件?

nle07wnf

nle07wnf1#

如果freq_prop_headlines是唯一包含小数的列,则将以下内容添加到脚本中可能会有所帮助。

# freq_prop_headlines is not exponential
# ex) 0.0012345 ---> 000.12345
/;([0-9]+)\.([0-9]{2})([0-9]*);/s//;\1\2.\3;/

# freq_prop_headlines is exponential
# ex) 123.45e-5 ---> 000123.45 ---> 000.12345
/;([0-9]+)\.([0-9]+)[eE]-5;/{
  s//;000\1\.\2;/
  s/([0-9]+)([0-9]{3})\.([0-9]+)/\1.\2\3/
}

# ex) 000.12345 ---> 0.12345
s/;0+\./;0./

# ex) 0001.2345 ---> 1.2345
s/;0+([1-9]+\.)/;\1/

相关问题