String

如何從包含另一個文件列表中的字元串的文本文件中提取行?

  • July 26, 2016

我有一個包含一堆城鎮人口資訊的文件。我有另一個文件,其中列出了這些城鎮的一個子集的名稱。我想使用第二個文件從第一個文件中選擇人口資訊。我該怎麼做?

例子:

文件 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

引用自:https://unix.stackexchange.com/questions/298377