如果要透過匹配公共欄位來合併兩個文字檔案中的資料,可以使用Linux join命令。它為靜態資料檔案添加了些許活力。我們會教你怎麼使用它。
資料為王。公司、企業和家庭都在這上面經營。但是資料儲存在不同的檔案中,由不同的人整理,這是一種痛苦。除了知道要開啟哪些檔案來查詢所需的資訊外,檔案的佈局和格式可能會有所不同。
您還必須處理管理方面的難題,即哪些檔案需要更新,哪些需要備份,哪些是遺留檔案,哪些可以存檔。
另外,如果您需要整合資料或跨整個資料集進行一些分析,您還有一個問題。在處理不同檔案的資料之前,如何使其合理化?如何進入資料準備階段?
好訊息是,如果這些檔案至少共享一個公共資料元素,那麼linuxjoin命令可以讓您擺脫困境。
我們將用於演示join命令使用的所有資料都是虛構的,從以下兩個檔案開始:
cat file-1.txt cat file-2.txt以下是file-1.txt的內容:
1 Adore Varian [email protected] Female 192.57.150.231 2 Nancee Merrell [email protected] Female 22.198.121.181 3 Herta Friett [email protected] Female 33.167.32.89 4 Torie Venmore [email protected] Female 251.9.204.115 5 Deni Sealeaf [email protected] Female 210.53.81.212 6 Fidel Bezley [email protected] Male 72.173.218.75 7 Ulrikaumeko Standen [email protected] Female 4.204.0.237 8 Odell Jursch [email protected] Male 1.138.85.117我們有一組編號的行,每行包含以下所有資訊:
以下是file-2.txt的內容:
1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93 8 Jursch [email protected] Male Hudson Valley $663,821.09file-2.txt中的每一行都包含以下資訊:
join命令與“fields”一起使用,在本文中,fields表示由空格、行的開始或行的結束包圍的文字部分。為了使join匹配兩個檔案之間的行,每行必須包含一個公共欄位。
因此,只有在兩個檔案中都顯示欄位時,才能匹配該欄位。IP地址只出現在一個檔案中,所以這不好。第一個名稱只出現在一個檔案中,因此我們也不能使用它。姓氏在兩個檔案中,但這是一個很差的選擇,因為不同的人有相同的姓氏。
你也不能將資料與**和**條目聯絡在一起,因為它們太模糊了。紐約地區和美元值也只出現在一個檔案中。
但是,我們可以使用電子郵件地址,因為它在兩個檔案中都存在,並且每個檔案對一個人都是唯一的。快速瀏覽檔案還可以確認每個檔案中的行對應於同一個人,因此我們可以使用行號作為要匹配的欄位(稍後我們將使用不同的欄位)。
注意,這兩個檔案中有不同數量的欄位,這很好,我們可以告訴join每個檔案使用哪個欄位。
但是,要注意像紐約地區這樣的欄位;在以空格分隔的檔案中,地區名稱中的每個單詞看起來都像一個欄位。因為有些區域有兩個或三個單詞的名稱,所以在同一個檔案中實際上有不同數量的欄位。這是可以的,只要你匹配出現在紐約地區前一行的欄位。
首先,必須對要匹配的欄位進行排序。我們在兩個檔案中都有升序數字,所以我們符合這個標準。預設情況下,join使用檔案中的第一個欄位,這是我們想要的。另一個合理的預設值是join期望欄位分隔符為空格。再說一遍,我們有了,所以我們可以繼續,然後開火加入。
由於我們使用了所有的預設值,所以我們的命令很簡單:
join file-1.txt file-2.txtjoin根據檔案在命令列中列出的順序,將檔案視為“檔案一”和“檔案二”。
輸出如下:
1 Adore Varian [email protected] Female 192.57.150.231 Varian [email protected] Female Western New York $535,304.73 2 Nancee Merrell [email protected] Female 22.198.121.181 Merrell [email protected] Female Finger Lakes $309,033.10 3 Herta Friett [email protected] Female 33.167.32.89 Friett [email protected] Female Southern Tier $461,664.44 4 Torie Venmore [email protected] Female 251.9.204.115 Venmore [email protected] Female Central New York $175,818.02 5 Deni Sealeaf [email protected] Female 210.53.81.212 Sealeaf [email protected] Female North Country $126,690.15 6 Fidel Bezley [email protected] Male 72.173.218.75 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Ulrikaumeko Standen [email protected] Female 4.204.0.237 Standen [email protected] Female Capital District $674,634.93 8 Odell Jursch [email protected] Male 1.138.85.117 Jursch [email protected] Male Hudson Valley $663,821.09輸出的格式如下:首先列印行匹配的欄位,然後列印檔案1中的其他欄位,然後列印檔案2中沒有匹配欄位的欄位。
讓我們試試我們知道行不通的東西。我們將把一個檔案中的行按順序排列,這樣join將無**確處理該檔案。file-3.txt的內容與file-2.txt相同,但第八行在第五行和第六行之間。
以下是file-3.txt的內容:
1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 8 Jursch [email protected] Male Hudson Valley $663,821.09 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93我們鍵入以下命令以嘗試將file-3.txt連線到file-1.txt:
join file-1.txt file-3.txtjoin報告檔案-3.txt中的第七行出現故障,因此未對其進行處理。第七行是以數字6開頭的,在正確排序的列表中,數字6應該在8之前。檔案中的第六行(以“8 Odell”開頭)是最後處理的一行,因此我們可以看到它的輸出。
如果您想檢視join是否符合檔案的排序順序,則可以使用--check order選項,而不會嘗試合併。
為此,我們鍵入以下內容:
join --check-order file-1.txt file-3.txtjoin提前告訴您file-3.txt檔案的第七行有問題。
在file-4.txt中,最後一行已被刪除,因此沒有第八行。內容如下:
1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93我們鍵入以下內容,令人驚訝的是,join不會抱怨並處理它能處理的所有行:
join file-1.txt file-4.txt輸出列出了七條合併行。
-a(print unpairable)選項告訴join也列印無法匹配的行。
在這裡,我們鍵入以下命令,告訴join列印檔案1中與檔案2中的行不匹配的行:
join -a 1 file-1.txt file-4.txt七行匹配,檔案一的第八行列印,不匹配。沒有任何合併資訊,因為file-4.txt不包含可以匹配的第8行。但是,至少它仍然出現在輸出中,因此您知道它在file-4.txt中沒有匹配項。
我們鍵入以下-v(抑制連線線)命令以顯示不匹配的任何行:
join -v file-1.txt file-4.txt我們看到第8行是檔案2中唯一沒有匹配項的。
讓我們在一個非預設欄位(欄位一)上匹配兩個新檔案。檔案-7.txt的內容如下:
[email protected] Female 192.57.150.231 [email protected] Female 210.53.81.212 [email protected] Male 72.173.218.75 [email protected] Female 33.167.32.89 [email protected] Female 22.198.121.181 [email protected] Male 1.138.85.117 [email protected] Female 251.9.204.115 [email protected] Female 4.204.0.237檔案-8.txt的內容如下:
Female [email protected] Western New York $535,304.73 Female [email protected] North Country $126,690.15 Male [email protected] Mohawk Valley $366,733.78 Female [email protected] Southern Tier $461,664.44 Female [email protected] Finger Lakes $309,033.10 Male [email protected] Hudson Valley $663,821.09 Female [email protected] Central New York $175,818.02 Female [email protected] Capital District $674,634.93用於加入的唯一合理欄位是email address,它是第一個檔案中的欄位1和第二個檔案中的欄位2。為了適應這種情況,我們可以使用-1(fileone欄位)和-2(filetwo欄位)選項。我們將用一個數字來表示每個檔案中的哪個欄位應該用於連線。
我們鍵入以下命令,告訴join使用檔案1中的第一個欄位和檔案2中的第二個欄位:
join -1 1 -2 2 file-7.txt file-8.txt檔案在電子郵件地址上合併,該地址顯示為輸出中每行的第一個欄位。
如果檔案中的欄位不是用空格分隔的,會怎麼樣?
以下兩個檔案用逗號分隔,多個單詞的地名之間只有空格:
cat file-5.txt cat file-6.txt我們可以使用-t(分隔符)來告訴join哪個字元用作欄位分隔符。在本例中,它是逗號,因此我們鍵入以下命令:
join -t, file-5.txt file-6.txt所有的線都是匹配的,而空格則保留在地名中。
另一個檔案file-9.txt與file-8.txt幾乎相同。唯一的區別是有些電子郵件地址有大寫字母,如下所示:
Female [email protected] Western New York $535,304.73 Female [email protected] North Country $126,690.15 Male [email protected] Mohawk Valley $366,733.78 Female [email protected] Southern Tier $461,664.44 Female [email protected] Finger Lakes $309,033.10 Male [email protected] Hudson Valley $663,821.09 Female [email protected] Central New York $175,818.02 Female [email protected] Capital District $674,634.93當我們加入file-7.txt和file-8.txt時,它執行得非常好。讓我們看看file-7.txt和file-9.txt會發生什麼。
我們鍵入以下命令:
join -1 1 -2 2 file-7.txt file-9.txt我們只匹配了六行。大寫字母和小寫字母的差異阻止了其他兩個電子郵件地址的連線。
但是,我們可以使用-i(忽略大小寫)選項強制join忽略這些差異,並匹配包含相同文字的欄位,而不考慮大小寫。
我們鍵入以下命令:
join -1 1 -2 2 -i file-7.txt file-9.txt所有八行匹配並連線成功。
在join中,當您在處理棘手的資料準備時,您有一個強大的盟友。可能您需要分析資料,或者您正試圖將其轉換為形狀以執行到其他系統的匯入。
不管情況如何,你都會很高興加入你的行列!
...表示id、name、grade、age等屬性。DBMS是表的集合,每個表都使用諸如外來鍵之類的約束進行關聯。有時僅僅使用一個表是不夠的。有些情況下需要使用多個表。要組合兩個表,至少有一列是公共的。表的組合稱為聯接。 目錄 1. 概...
... 注意行的順序是如何變化的嗎?Union以最有效的方式執行,因此返回的資料可以按順序變化。 ...
... 在本文中,我將向您展示如何在Linux上安裝、執行和使用PowerShell! ...
...許您在Android裝置上安裝誠實善良的Linux應用程式。下面是如何使用Termux應用程式。 ...
... 如何在windows10上安裝linux bash shell ...
要在Linux中重新命名檔案嗎?如果您知道如何在Windows、macOS或Chrome作業系統中完成這項工作,那麼您就知道如何在這裡完成這項工作。在大多數版本的Linux上,您只需右鍵單擊一個檔案並選擇Rename選項。 ...
想在Linux系統上新增使用者但不知道如何新增?在Linux上使用命令列介面管理使用者無疑是一項複雜的工作。而對於初學者來說,即使新增新使用者也是一場噩夢。 ...
... 讓我們探索如何從多個數據庫表中準確地檢索所需的資料,以及各種可用的聯接,這些聯接允許您提取所需的準確結果。 ...