다음과 같은 출력이 있습니다.
Course: StudentCount
('BCA_27', 2L)
('MCA_34', 15L)
('BBA_26', 3L)
('BBM_02', 14L)
('MBA_23', 13L)
원하지 않는 문자를 제거하려면 다음 명령을 사용하고 있습니다.
<output> |sed "s/['()]//g;s/,/:/g;s/\([0-9]\)L[ ]*$/\1/g;"|awk '{print $NF,$0}' | sort -nr | cut -f2- -d' '
이제 출력은 다음과 같습니다.
MCA_34 : 15
BBM_02 : 14
MBA_23 : 13
BBA_26 : 3
BCA_27 : 2
Course : StudentCount
awk
출력이 다음과 같도록 헤더 행이 제외되는 것을 어떻게 방지해야 합니까 ?
Course : StudentCount
MCA_34 : 15
BBM_02 : 14
MBA_23 : 13
BBA_26 : 3
BCA_27 : 2
답변1
awk를 사용하면 sed가 필요하지 않습니다.
$ awk -F"[',: ]+" -v OFS=' : ' '{print (NR>1) "\t" (NR==1 ? $1 OFS $2 : $3 OFS $4+0)}' file |
sort -k1,1n -k4,4nr | cut -f2-
Course : StudentCount
MCA_34 : 15
BBM_02 : 14
MBA_23 : 13
BBA_26 : 3
BCA_27 : 2
답변2
tail을 사용하여 특정 개수의 헤더 행을 건너뛸 수 있습니다. 예는 다음과 같습니다.
command | awk '{print $1}' | tail +2
명령 결과의 첫 번째 필드에서 awk를 실행한 후 처음 2줄을 건너뜁니다.
답변3
추천 작업 중프루모주어진논평보다 유연하게 만들려면 AWK 명령을 다음과 같이 변경할 수 있습니다.
awk 'NR==1 {h=$0; next} {print $NF,$0; if ($NF>m) m=$NF} END {print (m+1),h}'
헤더 앞에 다른 행보다 높은 숫자가 추가되고, 전체 입력 데이터의 최대값이 기록되며, 마지막 행이 처리된 후에만 헤더가 인쇄되도록 보장하는 것이 아이디어입니다.
또는 시스템이 /dev/fd/n
파일 설명자 연결 유형을 지원하는 경우 전체 파이프의 표준 출력을 복사하고 awk
헤더 줄을 새 파일 설명자에 인쇄하여 후속 명령이 실행되지 않도록 할 수 있습니다.
sed "s/['()]//g;s/,/:/g;s/\([0-9]\)L[ ]*$/\1/g;" |
{ awk 'NR == 1 {print >("/dev/fd/3"); next} {print $NF,$0}' |
sort -nr |
cut -f2- -d' '; } 3>&1
답변4
sed 스크립트를 통해 완료:
sed -e '1d' -e '2,$s/[^A-Z_0-9]/ /g' -r -e 's/\s+/;/g' -e 's/^;//g' -e 's/[A-Z];$//g' filename
산출
BCA_27;2
MCA_34;15
BBA_26;3
BBM_02;14
MBA_23;13