这是我的输入数据的示例:
$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
在 中 具有匹配标题的行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)
然后用它来 grep 你的第二个文件中的这些标题
grep -F "$interesting_titles" $csv2
grep 返回的任何内容都将是匹配项。
您可以将其缩短为一行
grep -F "$(cat $input |cut -d, -f2)" $csv2
如果您希望两个文件并排输出,您可能需要一个 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 中的记录