一意のテキストを含む一意の行

一意のテキストを含む一意の行

Linuxで独自の行を印刷するのに役立ちます。単語の例は次のとおりです。

A B
B C
C D
A E
F G
H I
I J

出力は

F G
H I

つまり、上記の例のように、行は最初に一意でなければならず、行の単語も一度だけ現れなければなりません。 「FG」は唯一の行で、「F」または「G」は他の行には表示されません。 「こんにちは」。

答え1

独自の単語のリストを取得できます。これにより、一致する行はすべての単語が一意の行になります。

tr -cs 'A-Z' '[\n*]' < words.txt |
  sort |
  uniq -u |
  perl -lne '
    if ($ARGV eq "-") {
      $u{$_}=1;
      next
    }
    for $w (/[A-Z]+/g) {
      next LINE unless $u{$w}
    }
    print' - words.txt

A-Z単語を構成する文字のリストに変更します。

答え2

awkでこれを行うことができます。

固有.awk

FNR == NR {
  for(i=1; i<=NF; i++)
    if(++w[$i] > 1)
      not_unique[$i] = 1
  next
}

{
  for(i=1; i<=NF; i++)
    if(not_unique[$i])
      next
}

1

次のように実行します。

awk -f unique.awk infile infile

出力:

F G

一行で:

awk 'FNR == NR { for(i=1; i<=NF; i++) if(++w[$i] > 1) not_unique[$i] = 1; next } { for(i=1; i<=NF; i++) if(not_unique[$i]) next } 1' infile infile

説明する

ファイルを2回解析する必要があります。まず、一意でない単語をすべて見つけてから、一意の単語を含む行のみを印刷する必要があります。これはプログラム構造に反映されます。最初のブロックは一意でない単語を含むハッシュを生成し、2番目のブロックは各行をチェックし、一意でない単語がある場合はスキップします。1末尾には一意の行が発生し、awkのデフォルト操作()が呼び出された場合にのみ到達します{ print $0 }

関連情報