사용자가 문자열 형식으로 직원 세부 정보를 입력하고 입력 문자열에 표시된 직원 세부 정보와 동일한 순서로 이전 3년 경력의 직원을 출력에 표시하려는 경우. 예를 들어 입력 문자열은 다음과 같습니다.
"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"
누구든지 쉘스크립트에서 이것을 달성하는 방법을 말해 줄 수 있습니까?
답변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
:
데이터 에 사용되는 "필드 구분 기호"입니다 .#
as를 사용하면RS
마지막 레코드의 마지막 필드 끝에 큰따옴표와 개행 문자가 포함되며 를 사용하여 이를 제거합니다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
첫 번째 필드를 기준으로 다시 정렬합니다.