通過傳入確切的數字和街道名稱,在具有數字範圍的房屋地址 txt 中查找字元串
語境
我是一名郵政工作者(郵件分揀員),正在嘗試編寫一個 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 f
或107 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} '
步驟:
- 檢查數字是奇數還是偶數,並相應地準備一個排除字元串。
- 第一個
grep
選擇與街道匹配的線。所有行都匹配一個空字元串,因此不指定街道將使所有行在此步驟中匹配。- 第二
grep
個使用第一步中的排除字元串排除描述為“奇數”或“偶數”的條目。awk
分割每一行,以空格和-
分隔符作為分隔符。如果前兩個欄位中的任何一個不完全是數字,則沒有指定範圍並列印該行。否則顯然前兩個欄位定義了一個範圍;然後根據該範圍測試該數字,如果在該範圍內則列印該行。