
長さ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のようなものであれば、間違った一致の可能性は希薄です。 (そして私は怠惰です:-))