如果用户以字符串形式输入员工详细信息,并且我们希望输出以与输入字符串中显示的员工详细信息相同的顺序显示具有前三年经验的员工。例如输入字符串:
"EMP101:Jack:CA:[email protected]:10#EMP102:Jill:Doctor:[email protected]:5#EMP103:Russell:Engineer:[email protected]:25#EMP104:Monica:Teacher:[email protected]:4#EMP105:John:Mangaer:[email protected]:8"
输出字符串:例如输入字符串:
"Jack:CA:10#Russell:Engineer:25#John:Mangaer:8"
谁能告诉我如何在 shellscript 中实现这一点
答案1
awk
您可以使用、sort
和head
的组合paste
:
awk 'BEGIN{RS="#"; OFS=FS=":"} {gsub(/"\n$/,"",$5); print NR,$2,$3,$5}' file \
| sort -t':' -k4nr \
| head -n3 \
| sort -n \
| cut -d: -f2-\
| paste -sd'#'
输出:
Jack:CA:10#Russell:Engineer:25#John:Mangaer:8
RS
是“记录分隔符”,默认为换行符,但您的记录由#
FS
是“字段分隔符”,用于:
您的数据。- 如果我们使用
#
asRS
,最后一条记录的最后一个字段将在末尾包含一个双引号和换行符,我们将用 删除它们gsub
。 - 您可以添加
| sed 's/.*/"\0"/'
以准确获取包括引号的输出。
答案2
echo "EMP101:Jack:CA:[email protected]:10#EMP102:Jill:Doctor:[email protected]:5#EMP103:Russell:Engineer:[email protected]:25#EMP104:Monica:Teacher:[email protected]:4#EMP105:John:Mangaer:[email protected]:8" \
| awk -F '#' 'BEGIN {OFS = "\n"} {$1 = $1; print}' \
| sort -k 5 -n -r -t : \
| head -n 3 \
| sort -k 1 -t : \
| awk -F : 'BEGIN {OFS = ":"} {print $2, $3, $5}' \
| paste -d '#' -s
结果:
Jack:CA:10#Russell:Engineer:25#John:Mangaer:8
按第一个字段再次排序。