从文件中删除重复的单词

从文件中删除重复的单词

我有一个格式类似于的文本文件

path1/path2/path3a 34474538656
path1/path2/path3a 8115147679
path1/path2/path3b 2266371027
path1/path2/path3b 3860823 
path1/path2/path3b 554247

而且这种模式仍在继续。我希望仅删除第 1 列重复条目并将其打印为

path1/path2/path3a 34474538656
                   8115147679
path1/path2/path3b 2266371027
                   3860823 
                   554247

这可能吗?

列由单个空格分隔

所有路径的长度相同

最好全局对齐,以使其更易于阅读。

答案1

这是一种方法:

$ awk '{ print seen[$1]++ ? "                   "$2 : $0}' file
path1/path2/path3a 34474538656
                   8115147679
path1/path2/path3b 2266371027
                   3860823
                   554247

也可以写成:

$ awk -v spacer='                   ' '{ print seen[$1]++ ? spacer$2 : $0}' file
path1/path2/path3a 34474538656
                   8115147679
path1/path2/path3b 2266371027
                   3860823
                   554247

或者

$ awk -v spacer='                   ' '{ if(seen[$1]++){print spacer$2}else{print}}' file
path1/path2/path3a 34474538656
                   8115147679
path1/path2/path3b 2266371027
                   3860823
                   554247

或者,在 中perl,动态计算垫片的长度:

$ perl -lane '$spacer=$seen{$F[0]}++ ? " " x length($F[0]) : $F[0]; print "$spacer $F[1]"' file
path1/path2/path3a 34474538656
                   8115147679
path1/path2/path3b 2266371027
                   3860823
                   554247

答案2

另一个实现

awk '
    $1 == prev {gsub(/./, " ", $1); changed = 1}
    !changed {prev = $1}
    {print; changed = 0}
' file

答案3

聚会迟到了,但这是我的解决方案:

awk '{this = $1 ; if (this == last) {gsub(/./, " ", $1)} ; last = this ; print $0}' input

特征

  • 重复路径的缩进自动与路径的长度相同
  • 不存储看到的每条路径(这在非常大的容量下可能会出现问题)
  • 允许未排序的输入(^^ 的副作用)

相关内容