ソートせずに重複行を削除する方法は?

ソートせずに重複行を削除する方法は?

行をソートせずに重複した行を削除したいと思います。また、先行スペースを無視したいと思います。

猫テスト.txt

 abc 

  def

pqr

      abc        

    xyz

             def 

    efg

その後、出力は次のようになります。

abc

def

pqr

xyz

efg

答え1

この試み:

$ awk 'NF && !($1 in a){a[$1];p=$1;print (getline == 0) ? p : p"\n"}' cat
abc

def

pqr

xyz

efg

説明する

  • NF && !($1 in a):空ではなく、値が連想配列にまだ表示されていない行のみを処理しますa
  • a[$1]:値が表示されない場合は連想配列に保存しますa
  • p=$1;print (getline == 0) ? $1 : p"\n":値を変数に保存しますp。ファイルの終わりでない場合は変数pラップを印刷し、ファイルの終わりでない場合はp値のみを印刷します。

答え2

このコマンドは機能するはずです。

awk '{$1=$1}1' filename | awk ' !x[$0]++'

最初のawkコマンドはファイル内のすべての先行スペースを削除し、2番目のawkコマンドは一意の要素のみを印刷します。

答え3

削除したい場合みんな重複(繰り返し空の行を含む)

awk '{if ($1 in a) next; a[$1]=$0; print}' test.txt

繰り返し空の行を維持するには

awk '/^$/ {print; next} {if ($1 in a) next; a[$1]=$0; print}' test.txt

答え4

コマンドの使用uniquekarrick/unique:

$ cat test.txt | tr -d ' ' | unique
abc

def
pqr
xyz
efg

関連情報