Home > database >  Match 1st value before comma of each line from first file with second file line by line
Match 1st value before comma of each line from first file with second file line by line

Time:03-31

My 1st file -

#cat 123
tom,123
jack,222
rock
google,908
mohan,323
ram,789

My 2nd file -

#cat www
vicky,tom,home
google,monk,uber
dhoom,monk,uber
ram,monk,uber
rock,monk,uber
jack,monk,uber

Desired output -

#cat  match_output.txt
tom,123,vicky,tom,home
rock,rock,monk,uber
jack,222,jack,monk,uber
google,908,google,monk,uber
ram,789,ram,monk,uber

For now, I'm getting only this -

#cat match_output.txt
rock,monk,uber

My Script -

#!/bin/bash

# because File2 is bigger, it gets the main loop.
# read each line of File2
>/var/lib/jenkins/Jack/match_output.txt
while IFS=, read -r string; do
    # read each line of File1.txt
    while IFS=, read -r string2; do
    # check match, and write if needed.
    if [[ $string == *"$string2"* ]]; then
        echo $string >> match_output.txt
        echo "wrote "$string" to match_output.txt..."
    fi
    done < /var/lib/jenkins/Jack/123
done < /var/lib/jenkins/Jack/www

Not able to read 1st value of 1st file before the comma of each line and match with 2nd file line by line and print the output in a new file....

CodePudding user response:

To get the first value before the comma, you can use the cut command.

With the following code

    if [[ $string == *"$string2"* ]]; then
        echo $string >> match_output.txt
        echo "wrote "$string" to match_output.txt..."
    fi

you compare the complete lines. If you want to compare $string with only the first value (before the comma) of $string2, you need to adjust this comparison.

    string2FirstValue=`echo "$string2" |cut -d',' -f1`
    if [[ $string == *"$string2FirstValue"* ]]; then
        echo $string2,$string >> match_output.txt
    fi

CodePudding user response:

Safer and more efficient way is to use awk:

awk '
BEGIN {FS=OFS=","}
FNR == NR {
   map[$1] = $0
   next
}
{
   for (i=1; i<=NF;   i)
      if ($i in map) {
         print map[$i], $0
         next
      }
}' 123 www

tom,123,vicky,tom,home
google,908,google,monk,uber
ram,789,ram,monk,uber
rock,rock,monk,uber
jack,222,jack,monk,uber
  • Related