Shell-Script
根據某些條件從文件中提取文本
我有一個文件,其中包含以下記錄:
434419\Teclu\Tudor\1501\9502 187650\Cosma\Sorin\1504\9253 239474\Teclu\Daniel\1502\5245 844936\Gaman\Mihai\1505\4074 942341\Avram\Tudor\1505\4543 137158\Gaman\Marius\1505\5244 531747\Francu\Daniel\1503\2226 382144\Teclu\Daniel\1501\9943 913409\Gaman\Mihai\1501\5473 901028\Avram\Mihai\1502\6169 382207\Dedu\Alex\1504\5428 726697\Gaman\Sorin\1502\5071 271503\Gaman\Ionut\1505\6643 147791\Dedu\Dragos\1503\4955 495572\Cosma\Alex\1505\9750 769482\Popescu\Sorin\1505\5472 410724\Marin\Mihai\1502\7317 381000\Marin\Daniel\1503\7321 251934\Popescu\Ionut\1504\8288 416161\Gaman\Mihai\1501\8245 523401\Gaman\Mihai\1504\3101 347491\Avram\Daniel\1504\2017 329372\Dedu\Sorin\1502\8528 509554\Popescu\Ionut\1502\7972
由 \ 分隔的欄位。第一個欄位是 ID,第二個是姓氏,第三個是名字,第四個是工資和第五個績效分數。
我必須編寫一個腳本,該腳本採用一個姓氏作為參數,並在文件的第一行和最後 10 行中找到具有該姓名的人。然後從那些中提取最低工資的人,或者如果有 2 個或更多同名和相同工資的人比較他們的績效得分,並取得分較高的人。對於這個人,我必須列印身份證。
我嘗試了頭尾切割和更多命令的組合:
{ head -n 10 file.txt ; tail -n 10 file.txt } | grep $NAME | sort -t '\' -r k 4
按工資從低到高排序,但如果工資相等,我不知道下一步該怎麼做。
保持命令的開頭:
{ head -n 10 file.txt ; tail -n 10 file.txt; } | grep $NAME | sort -t '\' -k 4 -k 5 | awk -F'\\' '!wage{wage=$4;id=$1;next} wage==$4{id=$1} END{print id}'
該
awk
腳本基本上將您對算法的文字描述放入公式中。當然,您也可以用更多 awk 邏輯替換管道中的前 3 個命令,例如:
$ myFun() { awk -F'\\' -v s=$2 -v l=`wc -l<$1` ' $2==s&&(NR<11||NR>l-11)&&(!wage||wage>$4||(wage==$4&&$5>perf)){ wage=$4; id=$1; perf=$5; } END{ print id; }' $1; } $ myFun exampleData.dsv Teclu 382144 $ myFun exampleData.dsv Gaman 416161
註釋中的 OP 註釋:’ $ 1’, ’ $ 2’等awk中的變數獨立於同名的外殼變數。