Newer
Older
csvCompare / csvCompare_list1notin2.sh
#!/bin/bash

#       Ce script compare 2 fichiers au format .csv avec des séparateurs ";"
#       Le fichier 1 est le fichier de référence auquel on va comparer le fichier 2
#		On va lister les lignes du fichier 1 dont la valeur de la colonne ci n'est pas trouvée dans la colonne cj du fichier 2
#
#       Les fichiers sont triés et dédoublonnés à la volée sur la bonne colonne
#       Les retours à la ligne sont codés à la volée au format Unix
#       Le script prend en compte d'éventuelles lignes d'entete de colonne
#		Date: 30/7/2024
#
#       Ce script est appelable par l'executable du même nom qui est une interface graphique écrite en Python
#       Il suffit juste que le script et l'executable soient dans le même répertoire et que Git Bash soit installé
#
#		Auteur: David Castelain


# Debuggage
#set -x


# Verification du nombre d'arguments
if [ "$#" -ne 7 ]; then
	echo "SYNTAXE: $0 [file1] [file1_numcol] [file1_nb_lines_header] [file2] [file2_numcol] [file2_nb_lines_header] [file_dest]"
	echo "Extrait les lignes de file1 dont la valeur de la colonne file1_numcol n'existe pas dans la colonne file2_numcol de file2"
	echo "file1 et file2 doivent être au format .csv avec des séparateurs ';'"
	echo "file1_numcol:             numéro de colonne à comparer du fichier 1"
	echo "file1_nb_lines_header:    nombre de lignes d'entête à ignorer dans le fichier 1"
	echo "EXEMPLE 1: $0 droits_onglet_issn.csv 3 1 masterlist.csv 1 1 issn_manquants_master-droits.csv"
	echo "EXEMPLE 2: $0 elsevier_2023_issn.csv 3 1 FileCount_Couperin2023.csv 1 1 elsevier2023_issn_manquants_master-droits.csv"
	exit 1
fi


file1=$1
file1_col=$2
file1_nb_lines_header=$(expr $3 + 1)
file2=$4
file2_col=$5
file2_nb_lines_header=$(expr $6 + 1)
file_dest=$7

join -t";" -v 1 -1 ${file1_col} -2 ${file2_col} \
 <(cat "${file1}" | tr -d '\r' | tail +${file1_nb_lines_header} | sed -e 's/"\([^";]*\);\([^";]*\)"/"\1.\2"/p' | sort -t";" -u -k ${file1_col},${file1_col}) \
 <(cat "${file2}" | tr -d '\r' | tail +${file2_nb_lines_header} | sed -e 's/"\([^";]*\);\([^";]*\)"/"\1.\2"/p' | sort -t";" -u -k ${file2_col},${file2_col})  > "${file_dest}"