grep文件中的每一行

时间:2015-11-28 03:18:55

标签: linux bash grep

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

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

"Dumbledore, Albus"
"Potter, Harry"
"Riddle, Tom

这是虚拟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

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

"Dumbledore, Albus", 100%, 8, 9
"Potter Harry", 34%, 56,67
"Riddle Tom", 99%, 3,4

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

3 个答案:

答案 0 :(得分: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

您可以将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}"

这给了我以下输出:

22:46 $ ./script.sh 
"Dumbledore Albus", 100%, 8, 9
"Potter Harry", 34%, 56,67
"Riddle Tom", 99%, 3,4

修改

假设names.txtgrades.csv作为规则被格式化为“姓氏,名字”不区分大小写:

#!/bin/bash
names="/path/to/names.txt"
grades="/path/to/grades.csv"
grep -fi "${names}" "${grades}"

答案 1 :(得分:3)

试试这个:

citizenkane

我在Ubuntu 14.04上用 while read l; do grep -i "${l//\"/}" grades.csv; done < names.txt 测试了它。输出:

bash

答案 2 :(得分:0)

只是为了新颖... 如果名称字符串中没有逗号,则也可以使用Unix join 运算符来实现。

man join

join实用程序对指定的文件执行等分联接,并将结果写入标准输出。

如果两个输入都已排序(在此示例中,文件被重写)

$ sort -b -o names.txt names.txt
$ sort -b -o grades.txt grades.txt

然后您可以执行以下操作

$ join -t ',' grades.txt names.txt
"Dumbledore Albus", 100%, 8, 9
"Potter Harry", 34%, 56,67
"Riddle Tom", 99%, 3,4

-t标志告诉join将字符用作输入和输出的字段定界符。