我正在尝试使用 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