【问题标题】:Check csv field for text size and convert to bytes检查 csv 字段的文本大小并转换为字节
【发布时间】:2021-02-06 16:37:12
【问题描述】:

我收到一个小型 CSV,它通常在 linux 主机上包含 20-50 行和 4 个字段。第三个字段必须是字节大小,但我发现它通常是人类可读的格式,并且值前面有额外的空格。如果它包含人类可读的文本,是否有一种简单的方法可以删除前导空格并将第三个字段转换为最接近的字节值(可以舍入)?下面的例子。

"3","3","  5815","User 1"
"6","12"," 788MB","User 2"
"2","4"," 983KB","User 3"
"25","4","1600MB","User 4"
"647","201","  19GB","User 5"

【问题讨论】:

    标签: bash csv sed import


    【解决方案1】:

    使用 awk:

    $ awk '
    BEGIN {
        FS=OFS=","                                   # field delimiter
        a[""]=1                                      # none is one
        a["KB"]=kilo=1024                            # KB defined
        a["GB"]=kilo*(a["MB"]=(kilo*(kilo)))         # defining MB and GB
    }
    {
        gsub(/^" *| *"$/,"",$3)                      # remove quotes and space
        match($3,/[KMG]B/)                           # extract the term
        $3="\"" $3*a[substr($3,RSTART,RLENGTH)] "\"" # lookup and multiply
    }1' file                                         # output
    

    输出

    "3","3","5815","User 1"
    "6","12","826277888","User 2"
    "2","4","1006592","User 3"
    "25","4","1677721600","User 4"
    "647","201","20401094656","User 5"
    

    它仅适用于 KB、MB 和 GB。如果需要,定义更多。另外,我的 KB 是老派 1024 B,当你离开 20 世纪时改变它。 ;D

    【讨论】:

    • 这非常有效,并且与您的 cmets 一起,我将能够通过插入类似的定义并将匹配线更改为 [KMGT] 来修改更大的尺寸。我也是老派,使用 1024,所以一切都很好。
    【解决方案2】:

    这可能对你有用(GNU sed 和 numfmt):

    sed -E "s/\"\s*([0-9]+[KMG]?)B?\"/\"'\$(numfmt --from=iec \1)'\"/3;s/.*/echo '&'/e" file
    

    删除第 3 个字段的填充和字母 B(如果存在),并使用其值替换为 shell 插值 numfmt 命令。然后echo 将调用插入的命令的整行。

    替代方案:

    sed 's/\([KMG]\)B/\1/;' file | numfmt -d \" --from=iec --field 6
    

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多