String
如何從包含另一個文件列表中的字元串的文本文件中提取行?
我有一個包含一堆城鎮人口資訊的文件。我有另一個文件,其中列出了這些城鎮的一個子集的名稱。我想使用第二個文件從第一個文件中選擇人口資訊。我該怎麼做?
例子:
文件 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
文件 2:
town-list.txt
Acton Adams Agawam
所需的輸出將是
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
基本上,如一般所說,如果該行包含文件 2 的其中一行中的字元串,則提取該行。
grep -f <(sed 's/.*/\^&\\>/' town-list.txt) ma-towns.txt
解釋:
grep -f file
讀取file
要匹配的模式列表。我們正在ma-towns.txt
列表中搜尋,使用來自 的模式town-list.txt
。每個單獨的行都被視為一個新模式,即一個新的搜尋詞。但是,這還不夠,所以我添加了一個
sed
來格式化搜尋詞,如下所示:^Acton\> ^Adams\> ^Agawam\>
^
make grep 僅在行首匹配該模式,而make\>
grep 僅在單詞在該點結束時匹配。這一起確保了搜尋詞只查看行的開頭(城鎮名稱所在的位置),並且搜尋詞必須在城鎮名稱結束的地方結束。
sed 命令本身執行一個
s
(替代)命令,格式為s/search/replace/
.搜尋詞
.*
匹配整行。替換 ,\^&\\>
將其替換為文字^
字元,後跟原始行,然後是文本\>
。這個答案做了什麼,另一個沒有:
- 處理以破折號開頭或包含反斜杠的城鎮名稱(這不太可能,但如果輸入來自使用者,您不希望他們能夠以不可預知的方式破壞您的腳本)。請注意,兩個答案都將城鎮名稱視為正則表達式,而不是文字搜尋詞。
- 按照 ma-towns.txt 中指定的原始順序輸出城鎮
- 表現更好
- 在行首搜尋城鎮名稱,而不僅僅是行中的任何位置
- 如果只有子字元串匹配,則不匹配城鎮(例如
Waterloo
將不匹配Waterlooville
)