【问题标题】:delete many empty spaces between columns and make only one-white-space between columns删除列之间的许多空格并在列之间只创建一个空格
【发布时间】:2015-05-26 16:54:21
【问题描述】:

我有一个包含超过 2500 列的文件。每列用制表符或几个空格分隔。

文件中的数据格式如下:

1    1    0
1    1    0
0    1    0
1    0    1
1    0    0
1    1    1
1    0    1

我想删除选项卡或列之间的许多空白空格,并在列之间只保留一个空格,如下所示。

1 1 0
1 1 0
0 1 0
1 0 1
1 0 0
1 1 1
1 0 1

如何删除空格?

【问题讨论】:

  • 这复制了相同的文件。在我的实际文件中,两列之间有 27 个空格。并且有超过 2500 列。

标签: awk sed gawk


【解决方案1】:

应该这样做:

awk '{$1=$1}1' file
1 1 0
1 1 0
0 1 0
1 0 1
1 0 0
1 1 1
1 0 1

通过设置$1=$1,它会清除所有的空格和制表符。 1 是打印出来的。

【讨论】:

  • 这对您的问题很好,因为您似乎主要想知道如何在 Awk 中执行此操作,但它不是很容易阅读。如果我正在编写其他人可能需要维护的代码,我可能会选择 sedtr 以提高可读性。 awk 还可以使用其他几种语法来完成这种非直观的“技巧”——例如awk {'$6=$9'}8
  • @A.Danischewski awk {'$6=$9'}8 这会将字段编号 6 更改为它具有原始值的另一个值。应该这样做:awk {'$6=$6'}8
  • @Jotne 是的,确实如此——但由于在这种情况下只有 3 列,它与$1=$1 具有相同的效果,如果你这样做$6=$2,它将提供另一列。 Awk 可以做的古怪有趣的技巧可以玩弄,但如果可以避免的话,我不会将它们包含在我的代码中。
  • 如果你想让它更清晰一些并且仍然使用 awk 你可以使用 gsub:awk '{gsub("[ ]+"," ",$0);print}' file
  • @A.Danischewski 这对 OP 来说也失败了,因为他也有标签。那么应该是:awk '{gsub("[ \t]*"," ",$0);print}' file
【解决方案2】:

使用 sed:

sed 's/[[:space:]]\+/ /g' filename

也可以使用 tr:

tr -s '[:blank:]' ' ' filename

【讨论】:

  • 由于我正在处理一个包含 > 2500 列和 45000 行的文件,因此“sed”命令需要很长时间。但是“tr -s”朗姆酒比“awk”快得多。
猜你喜欢
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2023-01-31
相关资源
最近更新 更多