我有一个格式类似于的文本文件
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
特征
- 重复路径的缩进自动与路径的长度相同
- 不存储看到的每条路径(这在非常大的容量下可能会出现问题)
- 允许未排序的输入(^^ 的副作用)