特定の行の重複項目を削除し、各行の最初の項目のみを保持し、指定されていない他の重複項目はそのまま残します。

特定の行の重複項目を削除し、各行の最初の項目のみを保持し、指定されていない他の重複項目はそのまま残します。

複数の重複項目を含むテキストファイルを編集しようとしています。目的は、文字列の最初の項目だけを保持し、同じ文字列の残りの重複行を削除することです。

サンプルファイルから

* Title 1
** Subtitle 01
#+begin_src
  Line 001
  Line 002
#+end_src

* Title 1
** Subtitle 02
#+begin_src
  Line 001
  Line 002
#+end_src

* Title 2
** Subtitle 01
#+begin_src
  Line 001
  Line 002
#+end_src

* Title 2
** Subtitle 02
#+begin_src
  Line 001
  Line 002
#+end_src

* Title N一つずつ所蔵したいのに無関係または指定されていない他のすべての重複行を保持します。ファイルに。結果は次のとおりです。

* Title 1
** Subtitle 01
#+begin_src
  Line 001
  Line 002
#+end_src

** Subtitle 02
#+begin_src
  Line 001
  Line 002
#+end_src

* Title 2
** Subtitle 01
#+begin_src
  Line 001
  Line 002
#+end_src

** Subtitle 02
#+begin_src
  Line 001
  Line 002
#+end_src

重複を排除する既存のソリューションは次のとおりです。

uniq file.txt

使いやすさのための便利なAWKワンライナー:

awk '!a[$0]++' contents.txt

shell - Unixでファイルをソートせずにファイルから重複行を削除する方法

perl -ne 'print if ! $x{$_}++' file

すべての重複エントリを無差別に削除します。

私はこれらのソリューションのバリエーションとGNUのsedループ形式を試しました。

duplicateLines=$(grep -E "^\* .*" file.org | uniq)
  printf '%s\n' "$duplicateLines" | while read -r line; do
  sed "s/$line//g2" file.org
done

成功しませんでした。私は純粋なパフォーマンスには気にしませんので、何度も繰り返すこと(たとえば、sed 指定された文字列を一度に1つずつ削除するためにループ内で呼び出す)は問題ありません。

どんな洞察力でも大変感謝いたします。

シェルスクリプトでこれを行うことができればと思いますが、Python、C、Javaなどの他のソリューションでも開いています。関数/ライブラリ名が何であるかを教えてください。そこで検索します。 。

ありがとうございます。

ベストアンサー1

!a[$0]++増分モードが次のように変わるように、awkパラダイムを簡単に変更できます。

awk '!a[$0]; /^\* Title/{a[$0]++}' file

おすすめ記事