grep文件中的每一行

smi*_*dha 1 linux bash grep

我有两个文件:一个是相当长的名称集(names.txt),另一个是文件(grades.csv),这是一个巨大的名称和相应的等级文件.我想迭代names.txt中的每一行,并使用整个匹配行在grades.csv中提取该名称.

这是一个小样本names.txt的样子

"Dumbledore, Albus"
"Potter, Harry"
"Riddle, Tom
Run Code Online (Sandbox Code Playgroud)

这是一个虚拟grade.csv文件的结构

"Granger, Hermione", 96.65%, 9,10
"Mcgonagall, Minerva", 80.43%, 6,7
"Dumbledore, Albus", 100%, 8, 9
"Potter, James", 91%, 7,89
"Ravenclaw, Rowena", 32%, 4,56
"Potter, Harry", 34%, 56,67
"Riddle, Tom", 99%, 3,4
Run Code Online (Sandbox Code Playgroud)

我想提取names.txt的每一行并搜索grades.csv来获取它

"Dumbledore, Albus", 100%, 8, 9
"Potter Harry", 34%, 56,67
"Riddle Tom", 99%, 3,4
Run Code Online (Sandbox Code Playgroud)

我知道我必须使用grep/awk/sed(我正在使用Linux环境)但我不知道如何使用grep循环文件中的行,因为我不是很擅长bash命令终端.任何帮助赞赏!

eri*_*rip 6

我做了一些更改names.txtgrades.csv-一些名字是用逗号分隔的,有些则不是.我在引号中删除了逗号,所以这里是新文件:

22:46 $ cat names.txt 
"Dumbledore Albus"
"Potter Harry"
"Riddle Tom"

22:46 $ cat grades.csv 
"Granger Hermione", 96.65%, 9,10
"Mcgonagall Minerva", 80.43%, 6,7
"Dumbledore Albus", 100%, 8, 9
"Potter James", 91%, 7,89
"Ravenclaw Rowena", 32%, 4,56
"Potter Harry", 34%, 56,67
"Riddle Tom", 99%, 3,4
Run Code Online (Sandbox Code Playgroud)

您可以使用grep文件参数-f:

22:46 $ cat script.sh 
#!/bin/bash
names="/path/to/names.txt"
grades="/path/to/grades.csv"
grep -f <(tr ',' '\n' < "${names}") "${grades}"
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出:

22:46 $ ./script.sh 
"Dumbledore Albus", 100%, 8, 9
"Potter Harry", 34%, 56,67
"Riddle Tom", 99%, 3,4
Run Code Online (Sandbox Code Playgroud)

编辑

假设names.txt并且grades.csv作为规则被格式化为"姓氏,名字"不区分大小写:

#!/bin/bash
names="/path/to/names.txt"
grades="/path/to/grades.csv"
grep -fi "${names}" "${grades}"
Run Code Online (Sandbox Code Playgroud)