awk 헤더 행 제외

awk 헤더 행 제외

다음과 같은 출력이 있습니다.

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

관련 정보