使用shellscript比较2个csv文件,并输出新csv文件中的差异

时间:2013-03-13 18:29:18

标签: bash unix ksh

(比方说)我有2个csv文件 - file1.csv& file2.csv如下所述:

**file1.csv**       
ID,version,cost                        
1000,1,30     
2000,2,40     
3000,3,50     
4000,4,60  



**file2.csv**      
ID,version,cost     
1000,1,30       
2000,2,45     
3000,4,55   
6000,5,70   

预期的o / p是一个新的csv文件说 - file3.csv应该包含两个文件中存在的ID的详细信息,但是与它相关的一些数据是不同的(这里是版本和成本) - as如下所示。

ID,field,old,new  
2000,cost,40,45     
3000,version,3,4    
3000,cost,50,55 

我需要一个unix bash/ksh脚本来执行此操作。我尝试使用sed/grep但无法获得正确的o / p。请帮帮我。

1 个答案:

答案 0 :(得分:1)

不是最优雅的解决方案,但它应该有效:

#!/usr/bin/ksh

csv1=file1.csv
csv2=file2.csv

echo "ID,field,old,new"
while read line; do
  grep "$line" "$csv2" >/dev/null && continue
  id=`echo "$line" | cut -d, -f1`
  grep "^$id," "$csv2" >/dev/null || continue
  version1=`echo "$line" | cut -d, -f2`
  cost1=`echo "$line" | cut -d, -f3`
  version2=`grep "^$id," "$csv2" | cut -d, -f2`
  cost2=`grep "^$id," "$csv2" | cut -d, -f3`
  if [ "$version1" != "$version2" ]; then
    echo "$id,version,$version1,$version2"
  fi
  if [ "$cost1" != "$cost2" ]; then
    echo "$id,cost,$cost1,$cost2"
  fi
done < "$csv1"