сравнение CSV-файлов

Я хочу написать сценарий оболочки для сравнения двух файлов .csv. Первый содержит имя файла, путь, второй файл .csv содержит имя файла, путь, цель. Теперь я хочу сравнить два файла .csv и вывести целевое имя, в котором файл из первого файла .csv существует во втором файле .csv.

Ex.

а.csv

build.xml,/home/build/NUOP/project1  
eesX.java,/home/build/adm/acl

b.csv

build.xml,/home/build/NUOP/project1,M1
eesX.java,/home/build/adm/acl,M2
ddexse3.htm,/home/class/adm/33eFg

Я хочу, чтобы вывод был примерно таким.

М1 и М2

Пожалуйста, помогите Спасибо,


person Surresh2121    schedule 22.01.2010    source источник


Ответы (3)


Если вам не обязательно нужен сценарий оболочки, вы можете легко сделать это на Python следующим образом:

import csv

seen = set()

for row in csv.reader(open('a.csv')):
  seen.add(tuple(row))

for row in csv.reader(open('b.csv')):
  if tuple(row[:2]) in seen:
    print row[2]
person Max Shawabkeh    schedule 22.01.2010
comment
не обязательно нужен сценарий оболочки. вы говорите так, будто только Python может справиться с этой задачей. - person ghostdog74; 22.01.2010
comment
Вовсе нет, но мне так проще. - person Max Shawabkeh; 22.01.2010

если эти M1 и M2 всегда находятся в полях 3 и 5, вы можете попробовать это

awk -F"," 'FNR==NR{
    split($3,b," ")
    split($5,c," ")
    a[$1]=b[1]" "c[1]
    next
}
($1 in a){
    print "found: " $1" "a[$1]
}' file2.txt file1.txt

выход

# cat file2.txt
build.xml,/home/build/NUOP/project1,M1 eesX.java,/home/build/adm/acl,M2 ddexse3.htm,/home/class/adm/33eFg
filename, blah,M1 blah, blah, M2 blah , end

$ cat file1.txt
build.xml,/home/build/NUOP/project1 eesX.java,/home/build/adm/acl

$ ./shell.sh
found: build.xml M1 M2
person ghostdog74    schedule 22.01.2010
comment
Благодарю. Если я правильно получу требование OP, результат останется прежним. - person ghostdog74; 22.01.2010

попробуйте http://sourceforge.net/projects/csvdiff/

Цитата: csvdiff — Perl-скрипт для сравнения/различения двух csv-файлов с возможностью выбора разделителя. Различия будут отображаться следующим образом: «Столбец XYZ в записи 999 отличается». После этого будет показан фактический и ожидаемый результат для этого столбца.

person max muster    schedule 09.08.2010