嘿伙計們,我一直在解決這個問題,我有一個CSV 檔案,我必須根據用戶的輸入過濾特定月份。 記錄格式
firstName,lastName,YYYYMMDD
但問題是輸入是字串,而檔案中的月份是數字。
例如
> cat guest.csv
Micheal,Scofield,20000312
Lincon,Burrows,19981009
Sara,Tancredi,20040923
Walter,White,20051024
Barney,Stinson,20041230
Ted,Mosbey,20031126
Eric,Forman,20070430
Jake,Peralta,20030808
Amy,Santiago,19990405
Colt,Bennett,19990906
> ./list.sh March guest.csv
Micheal,Scofield,20000312
uj5u.com熱心網友回復:
單線:
MONTH=March; REGEX=`date -d "1 ${MONTH} 2022" %m..$`; grep $REGEX guest.csv
uj5u.com熱心網友回復:
awk 可以輕松地將月份名稱轉換為數字并進行過濾。
awk -v month="March" -F , '
BEGIN { split("January February March April May June July August September October November December", mon, " ");
for(i=1; i<=12; i ) mm[i] = mon[i] }
mm[0 substr($3, 5, 2)] == month' guest.csv
該BEGIN塊設定了一對關聯陣列,可在主腳本中用于按名稱查找月份編號。更改-v month="April"為搜索不同的月份。
如果要將其包裝在 shell 腳本中,可以輕松地將引數決議為變數:
#!/bin/sh
monthname=$1
shift
awk -v month="$monthname" -F , '
BEGIN { split("January February March April May June July August September October November December", mon, " ");
for(i=1; i<=12; i ) mm[i] = mon[i] }
mm[0 substr($3, 5, 2)] == month' "$@"
uj5u.com熱心網友回復:
對于過濾March,您可以執行以下操作(在 bash 中):
grep -E $'03.."?\r?$' guest.csv
備注:處理 CRLF 行尾和參考日期
現在您只需在switch 中轉換March為:03case
#!/bin/bash
case $1 in
[Mm][Aa][Rr]|[Mm][Aa][Rr][Cc][Hh]|3|03)
month=03
;;
*)
echo "error: unknown month: $1" 1>&2
exit 1
;;
esac
grep -E "$month"$'.."?\r?$' guest.csv
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/471443.html
