我的文字行如下:
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。所以我不能要求所有客户安装新的可执行文件。
答案 0 :(得分:3)
您可以使用此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
打印当前行(重新格式化)。答案 1 :(得分:1)
sed也是一个不错的选择。
sed 's/ *, */,/g' file
我们假设这个CSV文件不包含这样的行:
a, b, "this field, this very one, should not be touched", d
答案 2 :(得分:0)
您可以使用以下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_path