Saturday, January 8, 2022

[sed & awk] 混合使用 sed and awk 尋找

nameState 所泄生的輸出被接管送到 awk 程式,以便抽取出每筆紀錄。

list

root@ubuntu:/media/sf_share/sedawk_progs/sedawk2progs/ch02# cat list
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA   

nameState

s/ CA/, California/
s/ MA/, Massachusetts/
s/ OK/, Oklahoma/
s/ PA/, Pennsylvania/
s/ VA/, Virginia/  

結果

root@ubuntu:/media/sf_share/sedawk_progs/sedawk2progs/ch02# sed -f nameState list | awk -F, '{print $4}'
Massachusetts
Virginia
Oklahoma
Pennsylvania
Massachusetts
Virginia
California
Massachusetts

列出每一個州名,並在其後印出每一個居民的名字。

這個 shell 命令稿分成三部分

首先呼叫 awk 以產生待排序的資料,當作 sort 之輸入

再呼叫 awk 測試排序好的輸入資料,以判斷當前紀錄中的州名是否與先前的紀錄重覆

byState

#! /bin/sh
awk -F, '{ 
	print $4 ", " $0 
	}' $* | 
sort |
awk -F, '
$1 == LastState { 
	print "\t" $2 
}
$1 != LastState { 
	LastState = $1
	print $1 
	print "\t" $2
}'
    

 

root@ubuntu:/media/sf_share/sedawk_progs/sedawk2progs/ch02# sed -f nameState list | ./byState
 California
	 Amy Wilde
 Massachusetts
	 Eric Adams
	 John Daggett
	 Sal Carpenter
 Oklahoma
	 Orville Thomas
 Pennsylvania
	 Terry Kalkas
 Virginia
	 Alice Ford
	 Hubert Sims

工作原理

root@ubuntu:/media/sf_share/sedawk_progs/sedawk2progs/ch02# sed -f nameState list | awk -F, '{print $4 ", " $0}'
 Massachusetts, John Daggett, 341 King Road, Plymouth, Massachusetts
 Virginia, Alice Ford, 22 East Broadway, Richmond, Virginia
 Oklahoma, Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma
 Pennsylvania, Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
 Massachusetts, Eric Adams, 20 Post Road, Sudbury, Massachusetts
 Virginia, Hubert Sims, 328A Brook Road, Roanoke, Virginia
 California, Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
 Massachusetts, Sal Carpenter, 73 6th Street, Boston, Massachusetts

預設的狀況下,程式 sort 會依字母順序排序每個輸入列,並從左到右檢視其中每個字元。

root@ubuntu:/media/sf_share/sedawk_progs/sedawk2progs/ch02# sed -f nameState list | awk -F, '{print $4 ", " $0}' | sort
 California, Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
 Massachusetts, Eric Adams, 20 Post Road, Sudbury, Massachusetts
 Massachusetts, John Daggett, 341 King Road, Plymouth, Massachusetts
 Massachusetts, Sal Carpenter, 73 6th Street, Boston, Massachusetts
 Oklahoma, Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma
 Pennsylvania, Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
 Virginia, Alice Ford, 22 East Broadway, Richmond, Virginia
 Virginia, Hubert Sims, 328A Brook Road, Roanoke, Virginia

為了依照州名順序重新排列紀錄,因此我們將州名加到每筆紀錄的起頭,當作排序的關鍵欄位。

配合 SVN ST

svn st | awk '{if ( $1 == "M") { print $0}}'

 

No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能