我有两个文件:一个是相当长的名称集(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命令终端。任何帮助赞赏!
答案 0 :(得分:6)
我对您的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
您可以将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.txt
和grades.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
将字符用作输入和输出的字段定界符。