sed:截断csv文件列中的小数

sed:截断csv文件列中的小数

我正在尝试使用 sed 删除 csv 文件数字的整个小数部分。我所能做的就是截断文件整列中的所有小数(即 .0),但我不知道如何仅在第六列中执行此操作。

输入:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28.0,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25.0,0,0,348123,7.65,F G73,S

预期输出:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S

我的尝试:

sed -r ‘s/\.0//g’ file.csv

答案1

有点尴尬,但我认为它完成了工作。

Pythoncsvkit包含用于处理 CSV 文件的命令行工具。其中包括csvcut,它的工作方式类似于标准cut命令,但它支持 CSV,这意味着它允许包含嵌入字段分隔符和换行符的字段,只要它们被正确引用即可。

使用csvcut,我们可以剪切出要修改的列,修改它,然后将其放回原处。我使用paste逗号作为分隔符将字段重新组合在一起。该paste实用程序获取三个输入流,分别对应于前几个字段(未修改)、我们要修复的字段(使用简单sed脚本修改)以及最后几个字段(未修改)。

paste -d, \
    <( csvcut -c -5  file.csv ) \
    <( csvcut -c  6  file.csv | sed '1!s/\..*//' ) \
    <( csvcut -c  7- file.csv )

sed表达式1!s/\..*//删除除第一行之外的所有行上的一个点及其后面的所有内容。

这效率稍低,因为它会读取整个输入文件三遍。

结果:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S

答案2

我无法执行此操作sed,因为使用逗号作为分隔符以及“名称”字段中的逗号不是分隔符使其变得太复杂,因此我使用了awk以下gsub选项:

awk -F ',' 'NR==1; NR>1{gsub("\.0","",$7);print} ' OFS="," file

考虑到这种情况,这有点混乱,但它设置了一个逗号作为分隔符,打印第一行,然后在第一行之后的任何行上,用.0第七个字段中的任何内容替换,因为名称中的逗号实际上使年龄成为第七个字段,然后再次将输出字段分隔符设置为逗号,然后打印:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S

答案3

使用 CSV 文件时,您面临的主要问题是,如果列的类型为字符串并且字符串括在(双)引号中,则列分隔符可能驻留在列值本身中。

因此,以下命令:

sed -r 's/^(([^,]*,){6})([^\.,]*)[^,]*(,.*)$/\1\3\4/g'

可以,但前提是文本字符串中没有逗号。如果您正在处理这种情况,则需要一个工具,例如上一张海报所建议的工具。

答案4

一个简单的awk方法可以是从末端查看年龄字段,因为从该末端开始,字段内部没有分隔符:

awk -F, -v OFS=, '
  NR>1{$(NF-6) = int($(NF-6))}1
' file

使用sed使用扩展的正则表达式,-r我们从末尾开始计算字段

sed -r '
  s/\.0((,[^,]*){6})$/\1/
' file

输出:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S

相关内容