配列の単語を一致させてファイルを1行ずつ分離します。

配列の単語を一致させてファイルを1行ずつ分離します。

以下は私の入力データの例です。

$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

入力ファイルから配列を作成し、変数からタイトルを分離するためにこのコードを書きました$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

$f2次に、各ヘッダー()を他のファイル($csv2)と比較して、一致するものがあるかどうかを確認したいと思います。

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

私はファイルを次のように比較できることを知っています。

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

上記のコードは内容全体と一致し、内側の行は順序が異なる可能性がcsv2あり、興味のない他の内容が含まれる場合があります。スクリプトは$f2、.NETファイルのヘッダーと一致する行のみを知らせたいと思いますcsv2。したがって、最初のヘッダーのみにある場合、出力は次のようになりますcsv2

Matching lines:

$9.99,Titan the Power,www.otherwebsite.com,13357
$9.99,Titan the Power,www.example.com,565654

上記のように比較できるように、元の行と一致する行を出力として表示したいと思います(他のフィールド値の間には若干の違いがありますが、$inputヘッダ$csv2は同じです)。

ベストアンサー1

私は次の最初のファイルからすべてのヘッダを取得します

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

次に、これを使用して2番目のファイルからこれらのヘッダーを取得します。

grep -F "$interesting_titles" $csv2

grepによって返されたすべての項目は一致します。

1行に短縮できます。

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

2 つのファイルを並べて出力するには、次の for ループが必要な場合があります。

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

$inputの各行を繰り返し、$inputの$csv2にあるレコードを確認して印刷します。

おすすめ記事