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,,
要求:
- 仅从 2、6、7 列中删除所有前导和尾随 spaces
- 第 7 列中的值应仅由单个 space 分隔
研究:
我尝试了很多awk
、sed
、tr
的组合,但都无法按照我的要求成功。我希望在 awk
、sed
、tr
中有一个更好的解决方案,只是因为我所有的客户都安装了有限的 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
我有如下文本行:
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,,
要求:
- 仅从 2、6、7 列中删除所有前导和尾随 spaces
- 第 7 列中的值应仅由单个 space 分隔
研究:
我尝试了很多awk
、sed
、tr
的组合,但都无法按照我的要求成功。我希望在 awk
、sed
、tr
中有一个更好的解决方案,只是因为我所有的客户都安装了有限的 CYGWIN。所以我不能要求所有客户安装新的可执行文件。
你可以使用这个 awk
:
awk -F' *, *' '=' OFS=, file
可理解的方式:
awk 'BEGIN{FS=" *, *"; OFS=","} =' file
正如@glennjackman 所说,使用更安全
awk 'BEGIN{FS=" *, *"; OFS=","} {=; print}' file
解释:
FS
- 设置输入字段分隔符OFS
- 设置输出字段分隔符=
- 这将使awk
将字段格式化为OFS
。 returnstrue
使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