2013-03-20 57 views
1

我只是厭倦了使用join命令而沒有獲得所需的結果,並且它返回了一些錯誤。在第二個字段加入未排序的文件

我還讀過所有與join命令相關的所有查詢,並且在SuperUser中也有,但無法獲得成功。

如何使用joinawk

file1.csv 
autoid|Mycolumn 
5|Odhav, Gujarat, 380010 
7|Navrangpura, Gujarat, 380009 
16|Kalupur, Gujarat, 380002 
32|Naroda, Gujarat, 380025 
62|Khamasa, Gujarat, 380001 
73|Sola Road, Gujarat, 380063 
74|Railwaypura, Gujarat, 380002 
78|Meghaninagar, Gujarat, 380016 
85|Thaltej, Gujarat, 380054 

file2.csv 
5|Odhav, Gujarat, 380010|22.406347|73.824345 
7|Navrangpura, Gujarat, 380009|22.328403|73.881841 
16|Kalupur, Gujarat, 380002|22.379901|73.814217 
32|Naroda, Gujarat, 380025|22.417059|73.887806 
38|Raikhad, Gujarat, 380001|22.491544|73.782878 
39|Ashram Road, Gujarat, 380006|22.279248|73.846393 
44|Raipur, Gujarat, 380002|22.346186|73.87462 
56|Jamalpur, Gujarat, 380022|22.518504|73.785024 
58|Patharkuva, Gujarat, 380001|22.308473|73.825071 
62|Khamasa, Gujarat, 380001|22.100711|73.707207 
73|Sola Road, Gujarat, 380063|22.026236|73.732926 
74|Railwaypura, Gujarat, 380002|21.992994|73.86893 
78|Meghaninagar, Gujarat, 380016|21.955106|73.878629 
85|Thaltej, Gujarat, 380054|21.989253|73.735725 

我使用這個命令,但是無法得到期望的結果:

$ join -t'|' -1 2 -2 2 <(sort -k2 Areaprob.csv) <(sort -k2 Com_remoteArea.csv)>output.csv 

它返回這樣的事情;正如你所看到的,我已經使用sort命令和上面給出的join

join: file 1 is not in sorted order 
join: file 2 is not in sorted order 

output.csv看起來是這樣的 - 它不返回所有9條爲file1.csv

Mycolumn|autoid|autoid|Gis_lat|Gis_long 
Khamasa, Gujarat, 380001|62|62|22.100711|73.707207 
Railwaypura, Gujarat, 380002|74|74|21.992994|73.86893 
Thaltej, Gujarat, 380054|85|85|21.989253|73.735725 
Sola Road, Gujarat, 380063|73|73|22.026236|73.732926 

回答

1

這是否幫助?

awk -F'|' -vOFS="|" 'NR==FNR{a[$0];next} $1FS$2 in a{print $2,$3,$4}' file1 file2 

awk -F'|' -vOFS="|" 'NR==FNR{a[$1];next} $1 in a{print $2,$3,$4}' file1 file2 

兩個AWK oneliners以上給出根據當前的示例性輸入相同 輸出。 (無標題):

Odhav, Gujarat, 380010|22.406347|73.824345 
Navrangpura, Gujarat, 380009|22.328403|73.881841 
Kalupur, Gujarat, 380002|22.379901|73.814217 
Naroda, Gujarat, 380025|22.417059|73.887806 
Khamasa, Gujarat, 380001|22.100711|73.707207 
Sola Road, Gujarat, 380063|22.026236|73.732926 
Railwaypura, Gujarat, 380002|21.992994|73.86893 
Meghaninagar, Gujarat, 380016|21.955106|73.878629 
Thaltej, Gujarat, 380054|21.989253|73.735725 

標題是固定的文本,你可以自己添加。

+1

嘿感謝它。你能向我解釋它是如何工作的!! – user1586957 2013-03-21 04:28:35

+0

@ user1586957它首先將file1的第一列保存到數組中,然後對於file2的每一行,檢查該數組中的第一列是否爲true。 – Kent 2013-03-21 09:39:17

0

您還需要使用sort的分隔符。下面應該工作:

join -t'|' -1 2 -2 2 <(sort -t '|' -k2 Areaprob.csv) <(sort -t'|' -k2 Com_remoteArea.csv) > output.csv 

您的排序命令排序從第二列開始的文件,而不是開始後'|' 。

+0

謝謝..!可以在不干擾file1.csv頭部行順序的情況下獲得輸出。請幫忙...! – user1586957 2013-03-21 04:32:20

2

你忘了告訴sort的分隔符。試着用sort -t'|' -k2

$ join -t'|' -j2 <(sort -t'|' -k2 file1) <(sort -t'|' -k2 file2) 
Kalupur, Gujarat, 380002|16|16|22.379901|73.814217 
Khamasa, Gujarat, 380001|62|62|22.100711|73.707207 
Meghaninagar, Gujarat, 380016|78|78|21.955106|73.878629 
Naroda, Gujarat, 380025|32|32|22.417059|73.887806 
Navrangpura, Gujarat, 380009|7|7|22.328403|73.881841 
Odhav, Gujarat, 380010|5|5|22.406347|73.824345 
Railwaypura, Gujarat, 380002|74|74|21.992994|73.86893 
Sola Road, Gujarat, 380063|73|73|22.026236|73.732926 
Thaltej, Gujarat, 380054|85|85|21.989253|73.735725 

注意:您可以使用-j2爲你在現場2在這兩個文件的加盟。


編輯:

您將需要awk如果你想保持標題:

awk -F'|' 'NR==1;FNR==NR{a[$2];next}$2 in a{print $2,$3,$4}' OFS='|' file1 file2 
autoid|Mycolumn 
Odhav, Gujarat, 380010|22.406347|73.824345 
Navrangpura, Gujarat, 380009|22.328403|73.881841 
Kalupur, Gujarat, 380002|22.379901|73.814217 
Naroda, Gujarat, 380025|22.417059|73.887806 
Khamasa, Gujarat, 380001|22.100711|73.707207 
Sola Road, Gujarat, 380063|22.026236|73.732926 
Railwaypura, Gujarat, 380002|21.992994|73.86893 
Meghaninagar, Gujarat, 380016|21.955106|73.878629 
Thaltej, Gujarat, 380054|21.989253|73.735725 
+0

謝謝..!可以在不干擾file1.csv頭部行順序的情況下獲得輸出。請幫忙...! – user1586957 2013-03-21 04:23:59

+0

@ user1586957是的,我已經添加了一個'awk'腳本來做到這一點。如果這解決了您的問題,請點擊答案旁邊的勾號接受此答案。 – 2013-03-21 14:37:00

+0

很好的解決方案!但是可以使用'join'和'tail'命令來完成。這不是很好,因爲它會使用很多進程而不是單個awk。 – TrueY 2013-04-22 07:35:39

相關問題