Shell-Script

根據某些條件從文件中提取文本

  • November 19, 2016

我有一個文件,其中包含以下記錄:

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中的變數獨立於同名的外殼變數。

引用自:https://unix.stackexchange.com/questions/324348