【问题标题】:Unix - Remove Leading/Trailing Spaces (Column Wise)Unix - 删除前导/尾随空格(按列)
【发布时间】:2017-03-16 18:27:18
【问题描述】:

我有如下文本行:

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 列中的值应仅由单个空格分隔

研究:

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

【问题讨论】:

标签: unix awk sed tr


【解决方案1】:

你可以用这个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 打印当前行(重新格式化)。

【讨论】:

  • 完美运行!!!非常感谢。如果您能稍微描述一下您的解决方案,那就太好了,这对进一步的开发会更有帮助。
  • 它解决了你的问题吗,@user3676305?由于您是新来的,如果您的问题已经解决,请不要忘记将答案标记为已接受。您可以单击答案旁边的复选标记将其从空心切换为绿色。如有任何问题,请参阅Help Center > Asking
  • @user3676305,更新答案。
  • 感谢您的解释。您的解决方案已被标记为“已接受”
  • 学究式地,$1=$1 返回 true 如果 $1 是一个非空字符串或者不是数字 0。这个输入恰好是这种情况,但如果不是,您将在输出中丢失行。使用输入 echo -e '0,first\n1,second\n,third' 进行测试。使用更安全{$1=$1; print}
【解决方案2】:

sed 也是一个不错的选择。

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

我们假设这个 CSV 文件不包含这样的一行:

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

【讨论】:

    【解决方案3】:

    你可以使用这个 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
    

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2020-08-20
      • 2018-10-04
      • 2013-07-20
      • 2013-09-23
      • 1970-01-01
      相关资源
      最近更新 更多