簡體   English   中英

加入聲明省略條目

[英]Join Statement omitting entries

使用:Unix 2.6.18-194.el5

我遇到一個問題,該聯接語句從匹配中省略了值/索引。 我發現值在11-90之間(在大約350萬個條目中),並且我嘗試查找外來字符,但是我可能忽略了某些內容(嘗試使用cat -v來查看隱藏的字符)。

這是我正在使用的join語句(為安全起見,僅簡化了輸出列):

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 | US 2 | US 3 | US 4 | US 5 | US 6 | US 7 | US 8 | US 9 | US 10 | US 11 | US 12 | US 13 | US 14 | US 15 | US 16 | US 17 | US 18 | US 19 | US 20 | US 21 | US 22 | US 23 | US 24 | US 25 | US 26 | US 27 | US 28 | US 29 | US 30 | US 31 | US 32 | US 33 | US 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的新文件時,我能夠使join語句與file1完全匹配。 但是,同一文件將與file2不匹配。

另一個奇怪的是,該文件的長度為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(join語句上仍然不匹配)
  2. 將代碼復制到記事本中,刪除vi中的行,然后將它們復制回(相同的結果,沒有匹配的11-90)
  3. 刪除第11-90行以查看問題是否轉移到90-170且沒有轉移

我認為可能缺少一些隱藏值,或者file1中的11-90與file2中的11-90不是相同的二進制等效項?

我在這里迷路了,任何幫助將不勝感激。

我嘗試了一下,然后發現了幾件事。

首先:這是次要的,但是我認為您在-o指示符中缺少逗號。 我將其更改為-o 1.1,2.1

但是,僅在您發布的片段上運行它,我只有三行輸出:

1|1
3|3
7|7

我認為這是因為join假定按字母順序排序,而您的輸入文件看起來像按數字排序。

join(1)的規則#1是要確保您的輸入已排序,並且join期望它們的方式相同!

當我對兩個輸入文件進行排序並再次加入時,我得到了18行輸出。 (排序很容易,因為您要加入第一列;我不必弄亂sort的列說明符。)

請注意,由於區域設置的問題,如今,排序並不總是按照您期望的方式排序。 我傾向於設置LC_ALL = C,以確保得到我慣用的老式行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM