在AWK

2014-01-19 18 views
1

不止一個條件我都包含以下格式行的文件:在AWK

<firstname> <lastname> <day_of_birth> <month_of_birth> <year_of_birth> 

我需要顯示誰在當前日期過生日的用戶。

我設法寫腳本,但只能通過檢查當天==當天。

我該怎麼寫awk行,檢查$ 3 ==日,還要檢查$ 4 ==月和$ 5 ==年?謝謝

# get current date: day, month, year 
day="$(date +'%d')" 
month="$(date +'%m')" 
year="$(date +'%Y')" 

birthdays=$(awk "\$3~/$day/ {print \$1, \$2;}" users.lst) 
echo $birthdays 

回答

3

您可以獲得當前日期從awk如下:

awk 'BEGIN { 
    "date +%d" | getline day 
    "date +%m" | getline month 
    "date +%Y" | getline year   
} 
$3==day && $4==month && $5==year { 
    print $1,$2 
}' users.lst 
+3

如果您使用函數getline考慮,確保你準備好並且完全理解在http://awk.info/?tip/getline上描述的所有注意事項。就我個人而言,我不會爲此使用getline,而是使用YMMV。 –

+0

@EdMorton感謝您的評論。在http://awk.info/?tip/getline上,它說'getline是從管道讀取的合適解決方案。但是,我想知道,你在這裏看到什麼問題嗎?例如,如果管道在訪問變量「日」,「月」和「年」之前關閉。或者我們可以依靠他們有一個明確的價值,即使管道沒有關閉? –

+1

getline是一種適合讀取管道的解決方案,但在這種情況下,沒有理由從管道讀取數據,例如,當您使用awk從文件中讀取數據時,發現調用某個shell命令來操作時很有用然後使用getline讀取結果,然後在awk中繼續處理。是的,只要你完成了每一個管道就應該關閉管道(比如'cmd =「date +%d」; cmd | getline day; close(cmd)'),我不確定後果是什麼在這種情況下不這樣做 - 我只是這樣做,所以我不需要閱讀爲什麼。 –

4

你不能在awk中像這樣shell變量。它可能會產生很多問題。您需要使用-v awk_var=$shell_var選項將shell變量傳遞給awk。

您可以使用此awk命令:

awk -v d=$day -v m=$month -v y=$year '$3==d && $4==m && $5==y {print $1, $2}' users.lst 

但是請注意GNU awk has built-in date/time functions,你可以直接避免調用date命令awk的前3次是這樣的:

awk '$3==strftime("%d") && $4==strftime("%m") && $5==strftime("%Y") 
    {print $1, $2}' users.lst 
4

你沒有張貼任何樣品輸入,所以它是一個猜測,但是這可能是你想要什麼:

awk -v date=$(date "+%d/%m/%Y") '$3"/"$4"/"$5 == date {print $1, $2}' file 
1

這裏是另一種方法:

awk '$3=="'$(date +%d)'"&&$4=="'$(date +%m)'"&&$5=="'$(date +%Y)'"{print $1,$2}' users.lst