2017-04-24 46 views
1

您好我有2名CSV在下面的格式,(基本上是一個電子郵件列表和時間,我們已經通過發送電子郵件的數量):如何比較和排序2 CSV的顯示差異

file1.csv

Email,Value  
[email protected],2  
[email protected],4  
[email protected],1  
[email protected],6 

file2.csv

Email,Value  
[email protected],3  
[email protected],6  
[email protected],8  
[email protected],2 

每個表中的值可能是不同的,我想要做的就是將結果輸出到一個新的CSV看起來像這樣:

file3.csv

Email,Value1,Value2  
[email protected],2,3  
[email protected],4,6  
[email protected],1,8  
[email protected],6,2 

我有一個bash腳本,我從別的地方把和它的工作的一部分,但它沒有列出我要找的結果。

任何人都可以幫助一個bash腳本嗎?

#!/bin/bash 

join -t"," -1 1 -2 1 -a1 file1.csv file2.csv | awk -F, ' BEGIN { 
    print "Email,Value" 
} NF > 3 { 
    if ($3 != $5) 
     print $1, $3, $5 
    if ($2 != $4) 
     print $1, $2, $4 
} ' OFS=, 

這是我通過以下得到的結果:

awk 'BEGIN{FS=OFS=","; printf "Name,Value1,Value2\n"}NR >1 && 
FNR==NR{map[$1]=$2; next}$1 in map{$(NF+1)=map[$1]; print}' file2.csv 
file1.csv 

結果:

Name,Value1,Value2 
,[email protected],2 
,[email protected],4 
,[email protected],1 
[email protected],6,2 
+0

,你能否告訴我們,每部分樣本值你需要 – Inian

+0

,你可以發佈你已經嘗試過什麼的_exact_輸出? – Inian

+0

你在file1中有一個輸入錯誤,行號用','用點'email4 @ email,com,6'替換爲'email4 @ email.com,6' – Inian

回答

0
  1. 通過構建從第一個文件的每一行運行的循環。

  2. 在該循環中,構建另一個循環,將第二個文件的每一行與第一個文件的當前行進行比較。

  3. 將匹配項寫入您的新文件。

1

使用join程序

join -t, -o0,1.2,2.2 -a1 -a2 <(sort <file1.csv) <(sort <file2.csv) 

否則,如果文件已經排序,幷包含相同的條目 使用bash內建

while 
    IFS=, read -u3 em1 val1 
    IFS=, read -u4 em2 val2 
    [[ -n $em1 ]] && [[ -n $em2 ]] 
do 
    if [[ $em1 = $em2 ]]; then 
     echo "$em1,$val1,$val2" 
    else 
     echo "ERROR: $em1 <> $em2" 
    fi 
done 3<file1.csv 4<file2.csv 
+0

我得到這個錯誤跟你寫的劇本一起: 名稱,值1,值 AWK:無法打開文件文件2 源1號線 – snowblind

+0

我現在已經解決了,複製的代碼完全,因爲它是,它運行但沒有給出預期的輸出。我只會得到:email2 @ email.com,32 沒有別的 – snowblind

+1

bash腳本假定所有條目都是相同的並且順序相同:它在fd3上打開file1並在fd4上打開file2並從每個文件中讀取一行if第一個字段等於回聲合併的行,腳本作爲示例給出,應該理解爲 –

1

漂亮直截了當Awk

awk 'BEGIN{FS=OFS=","; printf "Name,Value1,Value2\n"}NR >1 && FNR==NR{map[$1]=$2; next}$1 in map{$(NF+1)=map[$1]; print}' file2 file1 

產生

Name,Value1,Value2 
[email protected],2,3 
[email protected],4,6 
[email protected],1,8 
[email protected],6,2 

集的輸入和輸出場分離器,輸入線進行處理之前被執行,並且還需要最終頭信息中的BEGIN子句。部分FNR==NR在這種情況下運行的第一個文件,以便file2,創建哈希映射,與設置爲$1和值設置爲$2然後file1對於其散列索引值屬於在$1創建一個新的那些行的索引字段$(NF+1)表示最後一個字段+ 1爲新值並打印結果形成。如果你想保持順序

awk救援

+0

我試過了,得到以下錯誤:你能幫忙嗎? – snowblind

+0

名稱,值1,值2 awk:無法打開文件file2 源代碼行號1 – snowblind

+0

@snowblind:將file1和file2更改爲實際的csv文件名? – Inian

相關問題