Unix - 删除前导/尾随空格(列明智)

时间:2016-11-03 08:37:32

标签: unix awk sed tr

我的文字行如下:

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,,

要求:

  1. 删除所有领先&只有2,6,7列的尾随空格
  2. 第7列中的值应仅由单个空格分隔
  3. 研究

    我尝试了很多与awksedtr的组合,但根据我的要求无法成功。我希望在awksedtr中有一个更好的解决方案,因为我的所有客户都安装了有限的CYGWIN。所以我不能要求所有客户安装新的可执行文件。

3 个答案:

答案 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