如何仅使用与特定列表匹配的文本中的行来获取存档?

时间:2016-08-17 13:43:16

标签: bash awk

你好我正在写一个脚本从列表中提取一些行,主要的想法是我有一个名单列表,我想创建一个只有那些人的信息的存档,第一个列表如下所示:

Name    Address Age
Steve   72 Andover Dr.  11
Yuri    1133 Nicholas Av.       14
David   110 Arlington Street    11
Andy    38 Devonshire Road      11
Dan     38 Devonshire Road      14
Blaine  59 Village Road 11
Justin  59 Village Road 11
Rob     39 Jackson Drive        15
Russell 39 Jackson Dr   14
Justin  16 Crestwood Rd.        17
Tristan 75 Peak Avenue  11
Marty   101 Captains Walk       16
Jason   73 Minuteman Dr.        13
Joe     73 Minuteman Dr.        11
Philip  61 Prospect Avenue      11
Evan    281 Burnt Plains Road   11

名称列表如下:

Andy
Russell
Philip
Evan

我想生成一个名为newlist.txt的新存档,该存档应仅包含以下信息:

Andy    38 Devonshire Road      11
Russell 39 Jackson Dr   14
Philip  61 Prospect Avenue      11
Evan    281 Burnt Plains Road   11

为了实现这一点,我尝试编写以下脚本:

#!/bin/bash
while read line
do
        grep $line $2 >> newlist.txt
done <$1

我正在获取文件newlist.txt以及人员的信息,事实上我的脚本运行良好,但我不确定这是否是最好的方法,我正在考虑足够的注意事项,因为我将使用它由于篇幅很长,我决定展示我的代码以便收到建议,谢谢你们。

2 个答案:

答案 0 :(得分:2)

使用GNU grep,sed和bash:

grep -f <(sed 's/.*/^&[ \t]/' file2) file1

输出:

Andy    38 Devonshire Road      11
Russell 39 Jackson Dr   14
Philip  61 Prospect Avenue      11
Evan    281 Burnt Plains Road   11

请参阅:The Stack Overflow Regular Expressions FAQ

答案 1 :(得分:1)

使用awk可以在不使用正则表达式的情况下执行此操作:

awk 'FNR==NR{seen[$1]; next} $1 in seen' names.txt list.txt

Andy    38 Devonshire Road      11
Russell 39 Jackson Dr   14
Philip  61 Prospect Avenue      11
Evan    281 Burnt Plains Road   11