Combine palavras na matriz linha por linha para um arquivo separado

0

Aqui está uma amostra dos meus dados de entrada:

$9.99,Titan the Power,www.example.com,565654
$15.99,Conan The Barbarian,www.sure.com,565438
$1.99,Julia Cesar,www.bfg.com,69722

Eu escrevi este código para criar uma matriz a partir do arquivo de entrada e, em seguida, isolar o título com a variável $ f2.

#!/bin/bash
input="/home/test/Documents/Scripts/test.csv"

readarray myarray < $input



# Sends all of arrays into while loop which read each line by line
echo "${myarray[@]}" | while IFS=',' read -r f1 f2 f3 f4
do
# echo field 2 of each line
echo $f2 #This displays the title of each product (just for testing)
done

Agora, gostaria de comparar cada título ($ f2) com outro arquivo ($ csv2) para ver se há correspondências positivas.

csv2:

$1.99,The Power of Now,www.dvd.com,45674
$9.99,Titan the Power,www.otherwebsite.com,13357
$2.99,The incredible Hulk,www.purchase.com,13956

Eu sei que posso comparar arquivos com algo assim:

if [ "$f2" == "$csv2" ]; then
  echo "match"
fi

O código acima combina com a coisa toda, e as linhas no csv2 provavelmente estão em uma ordem diferente e contêm outras coisas que eu não estou interessado. Eu quero que o script me informe apenas das linhas de $ f2 que tem títulos correspondentes no csv2. Então, a saída pode ser algo como isto se apenas o primeiro título estivesse presente em csv2: EDIT: Gostaria que a linha original e a linha correspondente fossem exibidas como a saída para que eu pudesse compará-las, assim (note que outros valores de campo são ligeiramente diferentes entre $ input e & csv2, mas o título é o mesmo)

Matching lines:

$9.99,Titan the Power,www.otherwebsite.com,13357
$9.99,Titan the Power,www.example.com,565654
    
por neilH 12.05.2016 / 14:05

1 resposta

1

Eu pegaria todos os títulos do seu primeiro arquivo com algo como

interesting_titles=$(cat $input |cut -d, -f2)

use isso para grep seu segundo arquivo para esses títulos

grep -F "$interesting_titles" $csv2

Qualquer coisa retornada pelo grep seria uma correspondência.

Você pode encurtar isso para um de uma linha com

grep -F "$(cat $input |cut -d, -f2)" $csv2

Se você quiser a saída de ambos os arquivos lado a lado, você provavelmente desejará um loop for, como ....

cat $input |cut -d, -f2 | while read t; do
  grep -i "$t" $csv2
  if [ $? -eq 0 ];then
    grep -i "$t" $input
  fi
done

Isso fará um loop em cada linha em $ input, verificará e imprimirá esse registro em $ csv2 em $ input

    
por 12.05.2016 / 14:25