Unix - 删除 Leading/Trailing 个空格(按列)

Unix - Remove Leading/Trailing Spaces (Column Wise)

我有如下文本行:

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 列中删除所有前导和尾随 spaces
  2. 第 7 列中的值应仅由单个 space 分隔

研究:

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

你可以使用这个 awk:

awk -F' *, *' '=' OFS=, file

可理解的方式:

awk 'BEGIN{FS=" *, *"; OFS=","} =' file

正如@glennjackman 所说,使用更安全

awk 'BEGIN{FS=" *, *"; OFS=","} {=; print}' file

解释:

  • FS - 设置输入字段分隔符
  • OFS - 设置输出字段分隔符
  • = - 这将使 awk 将字段格式化为 OFS。 returns true 使 awk 打印当前行(重新格式化)。

sed 也是不错的选择。

sed 's/ *, */,/g' file

我们假设此 CSV 文件不包含如下行:

a, b, "this field, this very one, should not be touched", d

你可以使用这个 awk:

awk -F',' -v OFS=',' '{for (i=1;i<=NF;i++) gsub(/^ +| +$/,"",$i); print [=10=]}' file_path

或:

awk -F' *, *' '{for(i = 1; i < NF; i++) {printf $i","}; printf $NF"\n"}' file_path