固有のチェックサムを持つ行

固有のチェックサムを持つ行

長さnの行を含むファイルAがあります。 Aの各行に対して、長さnの行とそのキーを出力するプログラムがあります。プログラムは、Aの各行のキーシーケンスをファイルBに書き込むか、Aの各行についてstdoutに書き込むことができます。

個々のキーが重複しないように、Aのすべての行を取得する必要があります。これを達成する最も効率的な方法は何ですか? -kオプションがありますが、正確に私が望むことをしないようです。

編集する。コメントの説明。

A に次の行が含まれているとします。

foo
bar 
baz

2番目のプログラムは、次の行の主な出力を計算します。

xxx
yyy
xxx

1行目はfooの出力、2行目はbarの出力、3行目はbazの出力です。

これで正しい出力の1つは次のようになります。

foo
bar

答え1

あなたが指定したように(しかしあなたの質問に対するwurtelのコメントを考慮してください):

generate_keys A > B   # adjust this call however that program is defined to work

awk '
  NR==FNR { a[NR]=$1 ; next }
  !b[$1]++ { print a[FNR] }
' A B

答え2

一部のサンプルデータがないとテストできませんが、次のようになります。

paste <(generate-keys "$filename") "$filename" |
awk '! seen[$1]++ {print $2}'

答え3

$ getkeys A > B
$ sort B | uniq -c | awk '{if($1 == 1) print $2}' > C
$ paste B A | fgrep -f C | cut -f2-

説明する:

まず、各行のキーを生成します。

次に、各キーが表示される回数を数え、一度表示されるキーをファイルCに保存します。

次に、pasteこの行を一意のキーリストと一致させ、そのfgrep行のみを選択するために使用します(キーを省略)cut

Cの文字列はaで始まり、^notgrepを使用してコアであるfgrep行の先頭にのみ一致するようにするのが良いでしょう。しかし、md5sumのようなものであれば、間違った一致の可能性は希薄です。 (そして私は怠惰です:-))

関連情報