私はcontrol+rコマンド履歴を再帰的に検索するために使用することを本当に楽しんでいます。私はそれで使用したいいくつかの良いオプションを見つけました: # ignore duplicate commands, ignore commands starting with a space export HISTCONTROL=erasedups:ignorespace # keep the last 5000 entries export HISTSIZE=5000 # append to the history instead of overwriting (good for multiple connections) shopt -s histappend 私にとって唯一の問題は、erasedups連続した重複のみを消去することです-そのため、この一連のコマンドでは: ls cd ~ ls lsコマンドは、実際には2回記録されます。私は定期的にw / cronを実行することを考えました: cat .bash_history | sort | uniq …
このワンライナーは、事前ソートなしでテキスト入力から重複行を削除します。 例えば: $ cat >f q w e w r $ awk '!a[$0]++' <f q w e r $ インターネットで見つけた元のコードは次のとおりです。 awk '!_[$0]++' _Perlのようにawkで特別な意味を持つようになったので、これはさらに困惑しましたが、それは単なる配列の名前であることが判明しました。 これで、ワンライナーの背後にあるロジックがわかりました。 各入力行はハッシュ配列のキーとして使用されるため、完了すると、ハッシュには到着順に一意の行が含まれます。 私が学びたいのは、この表記がawkによってどのように解釈されるかです。たとえば、バング記号(!)の意味とこのコードスニペットの他の要素。 どのように機能しますか?
今日、このユースケースに出会いました。これは、一見シンプルなようだが、と周りいじるsort、uniq、sedそしてawkそれは自明だことを明らかにしました。 重複行のすべてのペアを削除するにはどうすればよいですか?つまり、指定された行の重複が偶数個ある場合は、それらをすべて削除します。重複する行の数が奇数の場合、1つを除くすべてを削除します。(ソートされた入力を想定できます。) クリーンでエレガントなソリューションが望ましいです。 入力例: a a a b b c c c c d d d d d e 出力例: a d e