0

使用: Unix 2.6.18-194.el5

この結合ステートメントが一致から値/インデックスを省略しているという問題があります。値が 11 ~ 90 (約 350 万のエントリのうち) であることがわかり、外国の文字を探してみましたが、何かを見落としている可能性があります (隠し文字を表示するために cat -v を試しました)。

これが私が使用している結合ステートメントです(セキュリティのために出力列を単純化しただけです):

join -t "|" -j 1 -o 1.1 2.1 file1 file2> fileJoined

file1 の内容 (最初の 20 個の値):

1 3 7 11 12 16 17 19 20 21 27 28 31 33 34 37 39 40 41 42

file2 の内容 (最初の 50 個の値で、一致する場所を確認できます):

1|米国 2|米国 3|米国 4|米国 5|米国 6|米国 7|米国 8|米国 9|米国 10|米国 11|米国 12|米国 13|米国 14|米国 15|米国 16|米国 17|米国 18|米国 19|米国 20|米国 21|米国 22|米国 23|米国 24|米国 25|米国 26|米国 27|米国 28|米国 29|米国 30|米国 31|米国 32|米国 33|米国 34 |US 35|US 36|US 37|US 38|US 39|US 40|US 41|US 42|US 43|US 44|US 45|US 46|US 47|US 48|US 49|US 50|US

私の最初のテストでは、file2 が原因のようです。値が 1 ~ 100 の新しいファイルを作成すると、結合ステートメントを file1 と完全に一致させることができるためです。ただし、同じファイルは file2 と一致しません。

もう 1 つの奇妙な点は、ファイルの長さが 350 万レコードで、値 90 で再び一致し始めることです。たとえば、fileJoined の出力は次のようになります (最初の 20 個の値のみ)。

1|1 3|3 7|7 90|90 91|91 92|92 93|93 95|95 96|96 97|97 98|98 99|99 106|106 109|109 111|111 112|112 115| 115 116|116 117|117 118|118

私が試した他のことは次のとおりです。

  1. vi を使用して手動で新しい行 11 を入力します (結合ステートメントではまだ一致しません)。
  2. コードをメモ帳にコピーし、vi の行を削除してからコピーし直します (同じ結果、一致する 11-90 はありません)。
  3. 11 ~ 90 行を削除して、問題が 90 ~ 170 に移行し、移行しないかどうかを確認します。

私が見逃しているいくつかの隠された値があると思いますか、または file1 の 11 - 90 は file2 の 11 - 90 と同じバイナリ同等物ではありませんか?

私はここで迷子になっています。どんな助けでも大歓迎です。

4

1 に答える 1

0

私はこれを試してみましたが、いくつかのことに気付きました。

最初: これはマイナーですが、指定子にコンマがないと思います-o。に変更しました-o 1.1,2.1

しかし、あなたが投稿したフラグメントだけで実行すると、3 行の出力しか得られませんでした。

1|1
3|3
7|7

これは、入力ファイルが数値順にソートされているように見えるのに、結合がアルファベット順のソートを想定しているためだと思います。

join(1) のルール #1 は、入力がソートされていることを確認することであり、join が期待するのと同じ方法です!

2 つの入力ファイルを並べ替えてから再度結合すると、18 行の出力が得られました。(最初の列に参加しているので、並べ替えは簡単でした。並べ替えの列指定子をいじる必要はありませんでした。)

最近では、ロケールの問題により、並べ替えが常に期待どおりに並べ替えられるとは限らないことに注意してください。私は LC_ALL=C を設定して、慣れ親しんだ昔ながらの動作を確実に取得する傾向があります。

于 2015-06-17T17:03:35.050 に答える