我有两个文件:一个是相当长的名称集(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命令终端.任何帮助赞赏!
我做了一些更改names.txt和grades.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)