Bash

通過傳入確切的數字和街道名稱,在具有數字範圍的房屋地址 txt 中查找字元串

  • May 9, 2021

語境

我是一名郵政工作者(郵件分揀員),正在嘗試編寫一個 bash 腳本,該腳本允許我輸入確切的街道地址和街道名稱的前幾個字母,並讓它返回包含路線編號資訊的匹配字元串。我必須通過低頭查看信件,然後抬頭查看帶有我所在城市的每個地址的大量海報,來對每天無法加工的數千封信件進行分類。這個腳本可以節省我真正的時間,所以我正在努力學習完成它的過程。我在 unix/linux 腳本方面有類似愛好的背景。不確定正則表達式是這裡的解決方案,還是 grep、find、awk、sed 或所有這些的變體!

我有一個包含地址列表(門牌號範圍和街道名稱)的文本文件,每個都在換行符上,如下所示:

6974-7075 hwy 99: ss1
7757-8079 hwy 99: ss14
98-258 even foo st N: 15
97-257 odd foo st N: 16
21-301 foo st S: 17
15-20 foo st S: 7
bar st: 1
fake st: 31
fake pl: 77
sample dr: 89

注意數字範圍的存在,一條路線的街道(沒有給出房屋編號),偶數和奇數說明符,道路類型(st,hwy,pl,dr等),北(N)和南(S)指標,最後是冒號後的路由資訊​​。

目前狀態

我有以下腳本可以返回我想要的字元串,只要我輸入一個與文本文件中完全相同的街道號碼:

#! /bin/bash

civic="$1"
street="$2"

grep $civic.*$street /path/to/addresses.txt 

執行./script.sh 7757./script.sh 7757 h將為我返回7757-8079 hwy 99: ss14。我喜歡這裡返回的完整字元串,而不僅僅是冒號後面的路線。但是,顯然,執行./script.sh 8020 h不會返回7757-8079 hwy 99: ss14,因為我的程式碼還沒有檢查範圍內的數字。

需要幫助

但是,我正在尋找一種能夠進入8020 h並仍然返回的方法7757-8079 hwy 9: ss14,因為 8020 在 7757-8079 範圍內。

此外,注意文本中的 foo st 具有不同路線的偶數和奇數範圍,以及 N 和 S 指示符。我正在尋找一種能夠進入107 f107 foo讓它返回97-257 odd foo st N: 16而不返回98-258 even foo st N: 15的方式,因為房子 # 很奇怪。對於那些偶數/奇數情況,偶數/奇數詞將始終在字元串中指定,因此如果輸入的房子 # 是奇數,則可能是 grep 或在具有數字範圍的字元串中搜尋這些詞?該範例還將返回21-301 odd foo st S: 17(注意 foo st S),因為房子 # 在範圍內,並且字元串中有奇數。我可以同時返回 N 和 S,因為我沒有時間指定 N 或 S。

我將非常感謝在我的努力中提供的任何幫助,無論是完全充實的答案,還是更接近的提示。不是來找茬的,只是尋求幫助!讓我知道我是否可以更具體。

#! /bin/bash

civic="$1"
street="$2"

if [ "$((civic%2))" = 1 ]; then
  exclude=" even "
else
  exclude=" odd "
fi

</path/to/addresses.txt grep "$street" \
  | grep -v "$exclude" \
  | awk -F '[ -]' -v civic="$civic" '
     {if ($1 !~ /^[0123456789]*$/ || $2 !~ /^[0123456789]*$/) print
      else if (civic>=$1 && civic<=$2) print}
    '

步驟:

  1. 檢查數字是奇數還是偶數,並相應地準備一個排除字元串。
  2. 第一個grep選擇與街道匹配的線。所有行都匹配一個空字元串,因此不指定街道將使所有行在此步驟中匹配。
  3. 第二grep個使用第一步中的排除字元串排除描述為“奇數”或“偶數”的條目。
  4. awk分割每一行,以空格和-分隔符作為分隔符。如果前兩個欄位中的任何一個不完全是數字,則沒有指定範圍並列印該行。否則顯然前兩個欄位定義了一個範圍;然後根據該範圍測試該數字,如果在該範圍內則列印該行。

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