숫자순으로 정렬

숫자순으로 정렬

입력 파일에서 ISBN 번호(세 번째 열)로 목록을 정렬한 file.sh다음 출력 파일( file.out)로 보내야 합니다. 입력 파일( file.input)에는 목록이 있습니다.

Donald Smith,Fire Lands,97868545414459
Adam Barry,The Armies,97564325678855
Jennifer Lelan,Childhood dreams,97546766544237

반복 구조를 사용하여 데이터와 헤더를 처리합니다 Author Name of book ISBN.

결과

Author                   Name of Book               ISBN

Jennifer  Lelan    Chilhood Dreams   97546766544237
Adam Barry          The Armies             97564325678855
Donald Smith        Fire Lands              97868545414459

답변1

첫 번째 부분은 2023년에 추가된 새로운 답변입니다. 이전 답변은 구분 기호 뒤에도 여전히 작동합니다.

$ mlr --icsv --implicit-csv-header --opprint  label Author,Title,ISBN then sort -n ISBN file.input
Author         Title            ISBN
Jennifer Lelan Childhood dreams 97546766544237
Adam Barry     The Armies       97564325678855
Donald Smith   Fire Lands       97868545414459

이는 다음을 사용합니다.밀러( mlr)는 데이터를 제목 없는 CSV로 읽고, 세 필드에 레이블을 추가하고, 필드의 레코드를 숫자로 정렬하고 ISBN, 모든 데이터를 "인쇄 가능한" 표 형식으로 출력합니다. Miller는 CSV를 지원하므로 쉼표, 개행 등이 포함된 인용 필드를 처리할 수 있습니다.

질문과 같이 긴 제목 'Name of Book'대신 (인용문)을 사용하세요 . 탭으로 구분된 값 출력을 생성하려면 대신 Title사용하세요 .--otsv--opprint

>file.output파일을 덮어쓰거나 생성하는 명령을 리디렉션합니다 file.output.


먼저, 당신은아니요이 데이터를 반복합니다.쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?

파일의 유일한 쉼표가 필드를 구분하는 쉼표인 경우

sort -t ',' -k3n -o file.output file.input

데이터는 세 번째 열의 숫자를 기준으로 숫자로 정렬됩니다. 출력이 기록됩니다 file.output.

주어진 데이터에 대해 file.output다음과 같습니다.

Jennifer Lelan,Childhood dreams,97546766544237
Adam Barry,The Armies,97564325678855
Donald Smith,Fire Lands,97868545414459

이 데이터를 추가로 처리하려면 awk프로그램 사용을 고려하세요. 어떤 종류의 처리를 수행할지 지정하지 않았으므로 다음은 각 행의 데이터를 변수(실제로는 필요하지 않음)로 추출하여 인쇄합니다.

sort -t ',' -k3n file.input |
awk -F ',' '{ author=$1; title=$2; isbn=$3;
              printf("Author: %s\nTitle: %s\nISBN: %s\n",
                     author, title, isbn) }'

이 경우 정렬된 데이터를 중간 파일에 저장할 필요가 없습니다.

질문의 데이터 출력을 제공합니다.

Author: Jennifer Lelan
Title: Childhood dreams
ISBN: 97546766544237
Author: Adam Barry
Title: The Armies
ISBN: 97564325678855
Author: Donald Smith
Title: Fire Lands
ISBN: 97868545414459

데이터를 멋진 열에 넣고 ISBN 번호에 대시를 사용하려면 필요하지 않습니다 . ISBN 번호 형식과 열 형식에는 awk다음이 사용됩니다 .sedcolumn

sort -t ',' -k3n file.input |
sed -E -e 's/,([0-9]{3})([0-9]{4})([0-9]{5})/,\1-\2-\3-/' |
column -s ',' -t

출력은 다음과 같습니다

Jennifer Lelan  Childhood dreams  975-4676-65442-37
Adam Barry      The Armies        975-6432-56788-55
Donald Smith    Fire Lands        978-6854-54144-59

ISBN 번호가 조금 이상하게 보입니다. 그 이유는 길이가 14비트이기 때문입니다. 진짜ISBN길이는 10자리 또는 13자리입니다., 위의 코드에서는 13자리(또는 최소 12자리)라고 가정합니다.

열 헤더를 추가하려면:

sort -t ',' -k3n file.input |
{ echo 'Author,Name of book,ISBN'
  sed -E -e 's/,([0-9]{3})([0-9]{4})([0-9]{5})/,\1-\2-\3-/'
} |
column -s ',' -t

생산하는

Author          Name of book      ISBN
Jennifer Lelan  Childhood dreams  975-4676-65442-37
Adam Barry      The Armies        975-6432-56788-55
Donald Smith    Fire Lands        978-6854-54144-59

...쉘에서 명시적인 루프를 사용하지 않고.

답변2

sort분명히 최고의 정렬 도구입니다.

필요한 경우 GNU awk를 사용할 수 있습니다 awk.

gawk -F, '
    {line[$NF] = $0} 
    END {
        PROCINFO["sorted_in"] = "@ind_num_asc"
        for (isbn in line) print line[isbn]
    }
' file

바라보다https://www.gnu.org/software/gawk/manual/html_node/Controlling-Array-Traversal.html그리고https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html

관련 정보