2016-03-03 83 views
0

例如,文件1awk比較兩個文件中的列,並在文件1中未顯示文件時打印文件2列

"ACCOUNT_ID","CTN","NAME","GATEWAY_GUID","DEVICE_GUID","CATALOG_ID","FW_VERSION","DATE_CREATED","STATUS_ID","LOCATION_CODE","BAN","Market_Area","State","IMEI","HW_MODEL" 
"306875",="9404653975","14-052917 14-052917","313A0B72E3E440DD8687BD681E55FB03","0",="000010000010004","FW: 1.04.122, JVM: Oracle Corporation 1.7.0_72-ea, OS: Linux 2.6.33.5","06/24/2014 14:32:38","0",="0003013034",="177046772949","DLS","TX",="351612051721824","Cisco DLC-100" 
"306875",="9404653975","14-052917 14-052917","7EED6EE61F0949EE99554D4D4F09E4FE","ACFF000001",="000010901000004","1.2.14","06/24/2014 21:28:17","0",="",="177046772949","DLS","TX",="351612051721824","" 
"306875",="9404653975","14-052917 14-052917","D57DAE988A1C482EA3217312EDC7466E ","ACFF010904",="000010907000004","","12/16/2015 23:39:21","0",="",="177046772949","DLS","TX",="351612051721824","" 

文件2

account,ban,ctn,first_name,last_name,device_gateway_guid,device_id,device_cat_id,IMEI,device_fw_vrsn,date_created,device_status,subscription_created,subscription_name,subscription_market,date 
DL!813269 , 418069632891 , undefined , MUHAMMAD , ANJUM , 313A0B72E3E440DD8687BD681E55FB03, ACFF010904 , 00010907000004 , 351612054025777 , , 2015-12-18 19:45:31 , 0 , undefined , [object Object] , WAS , undefined 
DL!782477 , 523266997720 , undefined , SAM , MAURER , 7EED6EE61F0949EE99554D4D4F09E4FE , 0 , 00010000010004 , 351612053801194 , FW: 1.04.122, JVM: Oracle Corporation 1.7.0_72-ea, OS: Linux 2.6.33.5 , 2015-12-18 19:02:27 , 0 , undefined , [object Object] , FLP , 2015-07-29 09:07:22 
DL!926875 , 578172109430 , undefined , TRACY , BUSH , D57DAE988A1C482EA3217312EDC7466E , 0 , 00010000010004 , 351612054481798 , FW: 1.04.122, JVM: Oracle Corporation 1.7.0_72-ea, OS: Linux 2.6.33.5 , 2016-01-23 16:09:21 , 0 , undefined , [object Object] , GLF , 2015-11-06 02:26:31 
"306875",="9404653975","14-052917 14-052917","313A0B72E3E440DD8687BD681E55FB03","0",="313A0B72E3E440DD8687BD681E55FB03","FW: 1.04.122, JVM: Oracle Corporation 1.7.0_72-ea, OS: Linux 2.6.33.5","06/24/2014 14:32:38","0",="0003013034",="177046772949","DLS","TX",="351612051721824","Cisco DLC-100" 

我想將文件1的 「GATEWAY_GUID」 欄目與文件2的device_gateway_guid列比較。輸出應該是file1中沒有看到的file2的所有記錄。例如:如果文件1有10條記錄,文件2有5000條記錄,其中5條與文件1相同。那麼我的輸出文件應該顯示文件1中沒有看到的5個列值,這在file2中是看不到的。

到目前爲止,我嘗試了下面的腳本,但沒用。任何幫助讚賞。

awk 'NR==FNR{c[$6]++;next};c[$4] == 0' s2_1.csv s1_1.csv > compares1s2.csv 
+3

請就如何創建一個MCVE([MCVE])讀了。你的每個文件中有20列左右(猜測 - 我沒有計算過),可以在你的例子中省略。這會讓我們更容易看到發生了什麼事情,並且會讓您更容易地看到發生了什麼。你需要最終畢業到全尺寸的文件,但你可以讓它在一個更簡單的系統上工作。 –

+2

顯示的命令行中的一個問題是,您沒有將字段分隔符設置爲逗號('-F,'會解決這個問題)。這是否搞砸了一切?您是否嘗試打印您正在閱讀的任何數據 - 例如「NR == FNR」段中的$ 6的值?我也不相信段落之間的' - '可能是好的,但我肯定不會把它放在那裏。 –

+2

您還有許多以'='符號開頭的字段,例如'...,=「000010000010004」,...'。這意味着完整的CSV解析器會將該字段視爲包含該「=」符號以及兩個雙引號(以及兩者之間的數字)。這是奇怪的格式,但它出現多次;這不僅僅是一次性的事故。 –

回答

0

第一步:解析文件1,所以你只需要的相關資料:

grep -v "GATEWAY_GUID" file1 | cut -d'"' -f8 
# or more difficult to read 
sed -n '2,$ s/\([^,]*,\)\{3\}"\([^"]*\).*/\2/p' file1 

根據你輸入你的可能的格式,你可能需要改變這一點。
輸出第一步

313A0B72E3E440DD8687BD681E55FB03 
7EED6EE61F0949EE99554D4D4F09E4FE 
D57DAE988A1C482EA3217312EDC7466E 

現在,你想這樣做

grep -Ev "313A0B72E3E440DD8687BD681E55FB03|7EED6EE61F0949EE99554D4D4F09E4FE|D57DAE988A1C482EA3217312EDC7466E" file2 

grep有一個選項可以從文件中讀取搜索字符串,所以這可能變成

grep -EvFxf tempfile_with_search_keys file2 

您可以使用「進程替換」將臨時文件保存在「內存」中:

grep -EvFxf <(some_command) file2 

對於some_command我可以使用的第一個命令解析文件1

grep -EvFxf <(grep -v "GATEWAY_GUID" file1 | cut -d'"' -f8) file2 
0

你需要的東西是這樣的:

awk ' 
    BEGIN { FS="[,\"]";} 
    FNR==NR { 
     a[ $11 ] ++; 
     next; 
    } 

    { tmp = gensub(/[ ]+/, "", "g", $6); 
     if(!(tmp in a) ) print tmp; 
    } 
' ff1.csv ff2.csv 
  • 假設filesnames是ff1.csv和FF2。CSV
  • 在這個問題提供的示例中有空格在第二個文件和某些行有引號有的沒有引號
  • 的報價是在分配在第二個文件涉及到FS
  • 的空間中的值與GNU AWK 4在Linux上
+0

你應該提到它由於gensub()而不是POSIX,所以只能用於一些awk變體(例如gawk)。 –

0

有點兒一次性測試gensub

  • 被刪除,但它適用於您的數據。例如:

    awk -F, 'NR==FNR { 
           s=$4; 
           gsub("\"", "", s); 
           gsub(/[[:space:]]/,"", s); 
           arr[s]++} 
          NR>FNR && FNR>1 { 
           s=$6; 
           gsub("\"", "", s); 
           gsub(/[[:space:]]/,"", s); 
           sub(/=/,"",s); 
           if (!(s in arr)) 
            print s; 
           }' file1 file2 
    
  • 0

    你不發表您的預期輸出,所以IDK的,如果這是你想要或不什麼,但在這裏你去反正:

    $ awk -F'[ "]*,[ "]*' 'NR==FNR{a[$4];next} (FNR==1) || ($6 in a)' file1 file2 
    account,ban,ctn,first_name,last_name,device_gateway_guid,device_id,device_cat_id,IMEI,device_fw_vrsn,date_created,device_status,subscription_created,subscription_name,subscription_market,date 
    DL!813269 , 418069632891 , undefined , MUHAMMAD , ANJUM , 313A0B72E3E440DD8687BD681E55FB03, ACFF010904 , 00010907000004 , 351612054025777 , , 2015-12-18 19:45:31 , 0 , undefined , [object Object] , WAS , undefined 
    DL!782477 , 523266997720 , undefined , SAM , MAURER , 7EED6EE61F0949EE99554D4D4F09E4FE , 0 , 00010000010004 , 351612053801194 , FW: 1.04.122, JVM: Oracle Corporation 1.7.0_72-ea, OS: Linux 2.6.33.5 , 2015-12-18 19:02:27 , 0 , undefined , [object Object] , FLP , 2015-07-29 09:07:22 
    DL!926875 , 578172109430 , undefined , TRACY , BUSH , D57DAE988A1C482EA3217312EDC7466E , 0 , 00010000010004 , 351612054481798 , FW: 1.04.122, JVM: Oracle Corporation 1.7.0_72-ea, OS: Linux 2.6.33.5 , 2016-01-23 16:09:21 , 0 , undefined , [object Object] , GLF , 2015-11-06 02:26:31 
    
    相關問題