입력 파일에서 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
다음이 사용됩니다 .sed
column
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