입력 문자열에서 데이터 필터링

입력 문자열에서 데이터 필터링

사용자가 문자열 형식으로 직원 세부 정보를 입력하고 입력 문자열에 표시된 직원 세부 정보와 동일한 순서로 이전 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

awksort, 및 다음 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

첫 번째 필드를 기준으로 다시 정렬합니다.

관련 정보