Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex sed/awk:将兆字节替换为字节(插入零)_Regex_Bash_Csv_Awk_Sed - Fatal编程技术网

Regex sed/awk:将兆字节替换为字节(插入零)

Regex sed/awk:将兆字节替换为字节(插入零),regex,bash,csv,awk,sed,Regex,Bash,Csv,Awk,Sed,我有.csv文件,其中字段用逗号分隔,行由\n分隔。 在某些行中,我有兆字节符号。我想将其替换为零,以获得(或多或少)正确的字节大小 我所拥有的是 ,2.6米, 我想要 ,2600000, 示例 2015-06-01 00:04:52.736,10.0.0.2,10.0.0.4,443,443,56923,2.6 M,10.156.119.1 2015-06-01 00:04:56.736,10.0.0.2,10.0.0.4,443,58935,55658,1.3 M,10.156.126.1

我有.csv文件,其中字段用逗号分隔,行由\n分隔。 在某些行中,我有兆字节符号。我想将其替换为零,以获得(或多或少)正确的字节大小

我所拥有的是

,2.6米,

我想要

,2600000,

示例

2015-06-01 00:04:52.736,10.0.0.2,10.0.0.4,443,443,56923,2.6 M,10.156.119.1
2015-06-01 00:04:56.736,10.0.0.2,10.0.0.4,443,58935,55658,1.3 M,10.156.126.1
2015-06-01 00:04:56.736,10.0.0.2,10.0.0.4,443,86,54801,1256,10.156.119.1
2015-06-01 00:04:52.736,10.0.0.2,10.0.0.4,443,49652,443,1.6 M,10.156.119.1
2015-06-01 00:04:53.732,10.0.0.2,10.0.0.4,443,443,55770,4.9 M,10.156.119.1
2015-06-01 00:04:54.732,10.0.0.2,10.0.0.4,443,80,45980,639,10.156.119.1
2015-06-01 00:04:54.732,10.0.0.2,10.0.0.4,443,63951,27058,1.2 M,10.156.119.1
2015-06-01 00:04:54.732,10.0.0.2,10.0.0.4,443,80,41035,13.8 M,10.156.119.1
2015-06-01 00:04:55.736,10.0.0.2,10.0.0.4,443,80,40078,7.9 M,10.156.119.1
2015-06-01 00:04:56.732,10.0.0.2,10.0.0.4,443,42008,4.5 M,10.156.119.1
目标

2015-06-01 00:04:52.736,10.0.0.2,10.0.0.4,443,443,56923,2600000,10.156.119.1
2015-06-01 00:04:56.736,10.0.0.2,10.0.0.4,443,58935,55658,1300000,10.156.126.1
2015-06-01 00:04:56.736,10.0.0.2,10.0.0.4,443,86,54801,1256,10.156.119.1
2015-06-01 00:04:52.736,10.0.0.2,10.0.0.4,443,49652,443,1600000,10.156.119.1
2015-06-01 00:04:53.732,10.0.0.2,10.0.0.4,443,443,55770,4900000,10.156.119.1
2015-06-01 00:04:54.732,10.0.0.2,10.0.0.4,443,80,45980,639,10.156.119.1
2015-06-01 00:04:54.732,10.0.0.2,10.0.0.4,443,63951,27058,1200000,10.156.119.1
2015-06-01 00:04:54.732,10.0.0.2,10.0.0.4,443,80,41035,13800000 M,10.156.119.1
2015-06-01 00:04:55.736,10.0.0.2,10.0.0.4,443,80,40078,7900000,10.156.119.1
2015-06-01 00:04:56.732,10.0.0.2,10.0.0.4,443,42008,4500000,10.156.119.1

由于示例数据中的最后一行缺少一列,这就复杂了

awk 'BEGIN {FS=OFS=","} {$(NF-1)=$(NF-1)*1000000} 1' file
如果有时有“M”,有时有“K”,我们可以考虑:

awk '
    BEGIN {
      FS=OFS=","
      mult[""]=1
      mult["K"]=1000
      mult["M"]=1000000
      mult["G"]=1000000000
    } 
    {
      split($(NF-1), a, " ")
      $(NF-1) = a[1] * mult[a[2]]
      print
    }
'

由于示例数据中的最后一行缺少一列,这就复杂了

awk 'BEGIN {FS=OFS=","} {$(NF-1)=$(NF-1)*1000000} 1' file
如果有时有“M”,有时有“K”,我们可以考虑:

awk '
    BEGIN {
      FS=OFS=","
      mult[""]=1
      mult["K"]=1000
      mult["M"]=1000000
      mult["G"]=1000000000
    } 
    {
      split($(NF-1), a, " ")
      $(NF-1) = a[1] * mult[a[2]]
      print
    }
'
  • 根据您的样品,只有1000个单位的倍数才有1个字母的数字,我们应该更改
可以使用
sed的/\.\([^,]*\)M/\1000000/'您的文件来简化
如果只有M出现在您的样本中(使用M表示值的点后面只有1位)

  • 根据您的样品,只有1000个单位的倍数才有1个字母的数字,我们应该更改

可以使用
sed's/\.\([^,]*\)M/\1000000/'您的文件来简化
如果只有M出现在您的样本中(使用M表示值的点后面只有1位)

数字200000从何而来?@t\u thirupathi它是
\2
然后是50s@Marcaitus,只有在小数点后正好有一个数字时,这才有效。@bro,它确实匹配并给出了一个输出,但输出是错误的。它只是简单地删除小数点,并始终附加5
0
s。@t_thirupathi,好的。没错。我不明白你的意思200000这个数字从哪里来?@t_thirupathi它是
\2
然后是5
0
s@Marcaitus,仅当小数点后正好有一个数字时才有效。@bro,它确实匹配并给出输出,但输出是错误的。它只是简单地删除小数点,并始终附加5
0
s。@t_thirupathi,好的。没错。我不明白你的意思正确的倍数不应该是1024*1024吗?正确的倍数不应该是1024*1024吗?请注意。。。数学乘法可能会产生不想要的结果,具体取决于数据库系统的引擎。e、 g.对于我来说,从2.6米开始,它给出了2.6 e^6:)这里有一个音符。。。数学乘法可能会产生不想要的结果,具体取决于数据库系统的引擎。e、 g.对于我来说,从2.6米开始,它给出了2.6 e^6:)