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

use*_*305 0 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  ,,
Run Code Online (Sandbox Code Playgroud)

我希望它们如下所示:

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,,
Run Code Online (Sandbox Code Playgroud)

要求:

  1. 仅从 2,6,7 列中删除所有前导和尾随空格
  2. 第 7 列中的值应仅由一个空格分隔

研究:

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

sat*_*sat 5

你可以使用这个awk

awk -F' *, *' '$1=$1' OFS=, file
Run Code Online (Sandbox Code Playgroud)

可以理解的方式:

awk 'BEGIN{FS=" *, *"; OFS=","} $1=$1' file
Run Code Online (Sandbox Code Playgroud)

正如@glennjackman 所评论的,使用更安全

awk 'BEGIN{FS=" *, *"; OFS=","} {$1=$1; print}' file
Run Code Online (Sandbox Code Playgroud)

解释:

  • FS - 设置输入字段分隔符
  • OFS - 设置输出字段分隔符
  • $1=$1- 这将awk使用OFS. 这将返回true这使得awk打印当前行(格式化)。