从文件中删除重复的单词

suh*_*oor 2 bash shell-script

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

path1/path2/path3a 34474538656
path1/path2/path3a 8115147679
path1/path2/path3b 2266371027
path1/path2/path3b 3860823 
path1/path2/path3b 554247
Run Code Online (Sandbox Code Playgroud)

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

path1/path2/path3a 34474538656
                   8115147679
path1/path2/path3b 2266371027
                   3860823 
                   554247
Run Code Online (Sandbox Code Playgroud)

这可能吗?

列由单个空格分隔

所有路径的长度相同

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

ter*_*don 6

这是一种方法:

$ awk '{ print seen[$1]++ ? "                   "$2 : $0}' file
path1/path2/path3a 34474538656
                   8115147679
path1/path2/path3b 2266371027
                   3860823
                   554247
Run Code Online (Sandbox Code Playgroud)

也可以写成:

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

或者

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

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


gle*_*man 5

另一个实现

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