我有一个包含一堆城镇人口信息的文件。我有另一个文件,它是这些城镇子集名称的列表。我想使用第二个文件从第一个文件中选择人口信息。我该怎么做?
例子:
文件 1: ma-towns.txt
Acton Town Middlesex Open town meeting 21,924 1735
Acushnet Town Bristol Open town meeting 10,303 1860
Adams Town Berkshire Representative town meeting 8,485 1778
Agawam City[4] Hampden Mayor-council 28,438 1855
Alford Town Berkshire Open town meeting 494 1773
Amesbury City Essex Mayor-council 16,283 1668
Amherst Town Hampshire Representative town meeting 37,819 1775
Run Code Online (Sandbox Code Playgroud)
文件2: town-list.txt
Acton
Adams
Agawam
Run Code Online (Sandbox Code Playgroud)
期望的输出是
Acton Town Middlesex Open town meeting 21,924 1735
Adams Town Berkshire Representative town meeting 8,485 1778
Agawam City[4] Hampden Mayor-council 28,438 1855
Run Code Online (Sandbox Code Playgroud)
基本上,如一般所说,如果该行包含文件 2 的其中一行中的字符串,则提取该行。
grep -f <(sed 's/.*/\^&\\>/' town-list.txt) ma-towns.txt
Run Code Online (Sandbox Code Playgroud)
解释:
grep -f file
读取file
要匹配的模式列表。我们正在ma-towns.txt
列表中搜索,使用来自 的模式town-list.txt
。每个单独的行都被视为一个新模式,即一个新的搜索词。
但是,这还不够,所以我添加了 ased
来格式化搜索词,如下所示:
^Acton\>
^Adams\>
^Agawam\>
Run Code Online (Sandbox Code Playgroud)
该^
品牌的grep仅在一行的开始匹配这个模式,和\>
品牌的grep只在这一点上,如果匹配的话结束。
这一起确保搜索词只查看行的开头(城镇名称所在的位置),并且搜索词必须在城镇名称结束的地方结束。
sed 命令本身运行一个s
(替代)命令,形式为s/search/replace/
.
搜索词.*
匹配整行。替换 ,\^&\\>
将其替换为文字^
字符,后跟原始行,后跟文本\>
。
这个答案做了什么,另一个没有:
Waterloo
不会匹配Waterlooville
)这将读取的线条file2
和解析file1
与grep
使用的线路:
while read line; do
grep "${line}" file1
done < file2
Run Code Online (Sandbox Code Playgroud)