【问题标题】:Sed/awk for String to integer conversion of a csv column in shell用于字符串到 shell 中 csv 列的整数转换的 Sed/awk
【发布时间】:2021-12-13 14:41:28
【问题描述】:

我需要将 csv 文件的第 7 列从浮点数转换为十进制数。这是一个巨大的文件,我不想在读取转换时使用。 awk 有什么快捷方式吗?

输入:

"xx","x","xxxxxx","xxx","xx","xx"," 00000001.0000"  
"xx","x","xxxxxx","xxx","xx","xx"," 00000002.0000"  
"xx","x","xxxxxx","xxx","xx","xx"," 00000005.0000"  
"xx","x","xxxxxx","xxx","xx","xx"," 00000011.0000"  

输出:

"xx","x","xxxxxx","xxx","xx","xx","1"  
"xx","x","xxxxxx","xxx","xx","xx","2"  
"xx","x","xxxxxx","xxx","xx","xx","5"   
"xx","x","xxxxxx","xxx","xx","xx","11" 

试过这些,有效。但是有更简单的吗?

awk 'BEGIN {FS=OFS="\",\""} {$7 = sprintf("%.0f", $7)} 1' $test > $test1
awk '{printf("%s\"\n", $0)}' $test1

【问题讨论】:

    标签: awk sed integer


    【解决方案1】:
    awk 'BEGIN{FS=OFS=","} {gsub(/"/, "", $7); $7="\"" $7+0 "\""; print}' file
    

    输出:

    "xx","x","xxxxxx","xxx","xx","xx","1" "xx","x","xxxxxx","xxx","xx","xx","2" "xx","x","xxxxxx","xxx","xx","xx","5" "xx","x","xxxxxx","xxx","xx","xx","11"

    gsub(/"/, "", $7):从 $7 中删除所有 "

    $7+0:将 $7 中的数字减少到最小表示

    【讨论】:

    • 工作就像一个魅力。正是我需要的。也谢谢你的详细解释
    【解决方案2】:

    使用您展示的示例,请尝试关注awk 程序。

    awk -v s1="\"" -v OFS="," '{$NF = s1 ($NF + 0) s1} 1' Input_file
    

    解释: 简单的解释是,将OFS 设置为, 然后在主程序中;在每行的最后一个字段中仅保留数字并用" 覆盖最后一个字段,重新排列字段并打印已编辑/未编辑的所有行。

    【讨论】:

    • 缺少右括号。你能解释一下 $NF 是做什么的吗?
    • @GD,抱歉,这是一个错字,现在已修复,现在应该起飞了。
    • @GD, NF 是保存当前记录中字段数的 awk 变量。由于字段从一开始编号,NF 也是最后一个字段的编号。所以$NF是最后一个字段的内容。
    • @glennjackman "xx","x","xxxxxx","xxx","xx","xx",",1" "xx","x","xxxxxx", "xxx","xx","xx",",2" 我得到这样的.. 额外的逗号添加
    • @Ravinder,第一个 awk 正文只需要 {$NF = s1 ($NF + 0) s1} -- 需要添加前导引号。另外,分配 $NF 已经重写 $0,不需要$1=$1
    【解决方案3】:

    另一个简单的awk解决方案:

    awk 'BEGIN {FS=OFS="\",\""} {$NF = $NF+0 "\""} 1' file
    
    "xx","x","xxxxxx","xxx","xx","xx","1"
    "xx","x","xxxxxx","xxx","xx","xx","2"
    "xx","x","xxxxxx","xxx","xx","xx","5"
    "xx","x","xxxxxx","xxx","xx","xx","11"
    

    【讨论】:

      猜你喜欢
      • 2014-10-19
      • 1970-01-01
      • 2015-10-25
      • 2015-01-13
      • 2019-04-07
      • 2014-10-18
      • 2017-02-08
      • 1970-01-01
      • 2015-03-05
      相关资源
      最近更新 更多