我有如下文字行:
P, 123456 ,01,A,H, 123456 ,123456 123456 ,,
P,123456 ,01,A,H, 123456, 123456 123456,,
P, 123456,01,A,H,123456 ,123456 123456 ,,
P, 123456,01,A,H, 123456, 123456 123456,,
P,123456 ,01,A,H,123456 ,123456 123456 ,,,我想让它们像下面这样:
P,123456,01,A,H,123456,123456 123456,,
P,123456,01,A,H,123456,123456 123456,,
P,123456,01,A,H,123456,123456 123456,,
P,123456,01,A,H,123456,123456 123456,,
P,123456,01,A,H,123456,123456 123456,,需求:
研究:
我尝试了许多与awk,sed,tr的组合,但是不能按照我的要求成功。我希望在awk、sed、tr中有一个更好的解决方案,因为我的所有客户端都安装了有限的CYGWIN。因此,我不能要求我的所有客户端安装新的可执行文件。
发布于 2016-11-03 08:47:32
您可以使用这个awk
awk -F' *, *' '$1=$1' OFS=, file可以理解的方式:
awk 'BEGIN{FS=" *, *"; OFS=","} $1=$1' file@glennjackman评论说,使用起来更安全
awk 'BEGIN{FS=" *, *"; OFS=","} {$1=$1; print}' file解释:
FS -设置输入字段分隔符OFS集输出字段分隔符$1=$1 -这将使awk用OFS格式化字段。这将返回true,它使awk打印当前行(重新格式化)。发布于 2016-11-03 10:53:14
sed也是一个不错的选择。
sed 's/ *, */,/g' file我们假设这个CSV文件不包含如下一行:
a, b, "this field, this very one, should not be touched", d发布于 2020-10-29 09:31:26
您可以使用这个awk:
awk -F',' -v OFS=',' '{for (i=1;i<=NF;i++) gsub(/^ +| +$/,"",$i); print $0}' file_path或者:
awk -F' *, *' '{for(i = 1; i < NF; i++) {printf $i","}; printf $NF"\n"}' file_pathhttps://stackoverflow.com/questions/40396947
复制相似问题