我有一个格式类似于的文本文件
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)
这可能吗?
列由单个空格分隔
所有路径的长度相同
最好全局对齐,以使其更易于阅读。
这是一种方法:
$ 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)
另一个实现
awk '
$1 == prev {gsub(/./, " ", $1); changed = 1}
!changed {prev = $1}
{print; changed = 0}
' file
Run Code Online (Sandbox Code Playgroud)