Find match in csv file

I have two CSV files.

1.csv contains:

46700468915;2000

2.csv contains:

4670046;Tele2

I am trying to searching from 2.csv if 4670046 exists in 1.csv which is does and then take from 2.csv Tele2 and add in 1.csv if no match do not add

awk 'NR==FNR {a[$1]=$2; next} $2 in a {print $0, a[$2]}' OFS='\t' 2.csv 1.csv
3

2 Answers

You have a few issues here:

  1. you need to set awk's field separator appropriately: by default it is whitespace, whereas your files appear to be delimited by semicolons

  2. you are trying to match on a partial field: 4670046 is in a but 46700468915 isn't

  3. you seem to be confused about which field you are matching, $1 or $2

If you know that you want to match the first 7 characters, you can try

awk -F ';' ' NR==FNR {a[$1]=$2; next} {k = substr($1,1,7)} k in a {print $0, a[k]}
' OFS='\t' 2.csv 1.csv

or equivalently

awk ' BEGIN{FS=";"; OFS="\t"} NR==FNR {a[$1]=$2; next} {k = substr($1,1,7)} k in a {print $0, a[k]}
' 2.csv 1.csv

Ex. given

$ head ?.csv
==> 1.csv <==
46700468915;2000
==> 2.csv <==
4670046;Tele2

then

$ awk 'BEGIN{FS=";"; OFS="\t"} NR==FNR {a[$1]=$2; next} {k = substr($1,1,7)} k in a {print $0, a[k]}' 2.csv 1.csv
46700468915;2000 Tele2

The awk solution should be much faster but here is an example, how to achieve this via bash script, which read each line of 2.csv as -array and then uses sed to do the changes (the if statement is not essential part of the script).

$ cat ./script.sh
#!/bin/bash
TARGET_FILE="./1.csv"
ORIGIN_FILE="./2.csv"
# In order to append new column to a line, comment-out -i.bak
while IFS=';' read -r -a line
do if grep -q "${line[0]}" "$TARGET_FILE" then sed "/^${line[0]}/ s/$/;${line[1]}/" "$TARGET_FILE" #-i.bak fi
done < "$ORIGIN_FILE"
echo '-----'
# In order to replace the second column of a line, comment-out -i.bak
while IFS=';' read -r -a line
do if grep -q "${line[0]}" "$TARGET_FILE" then sed -r "s/(^${line[0]}.*\;).*$/\1${line[1]}/" "$TARGET_FILE" #-i.bak fi
done < "$ORIGIN_FILE"

Example of usage:

$ cat 1.csv
46700468915;2000
46700568916;3000
46700668917;4000
$ cat 2.csv
4670046;Tele2
4670047;Tele3
4670048;Tele4
$ ./script.sh
46700468915;2000;Tele2
46700568916;3000
46700668917;4000
-----
46700468915;Tele2
46700568916;3000
46700668917;4000
2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like