次のような形式のテキストファイルがあります。
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
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
特徴
- 繰り返しパスのインデントは自動的にパスの長さに等しくなります。
- 表示されているすべてのパスを保存しない(大容量では問題になる可能性があります)
- ソートされていない入力を許可する(^^の副作用)