ファイルから重複する単語を削除する

ファイルから重複する単語を削除する

次のような形式のテキストファイルがあります。

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

特徴

  • 繰り返しパスのインデントは自動的にパスの長さに等しくなります。
  • 表示されているすべてのパスを保存しない(大容量では問題になる可能性があります)
  • ソートされていない入力を許可する(^^の副作用)

関連情報