📄 ch36_02.htm
字号:
<HTML><!--Distributed by F --><HEAD><TITLE>[Chapter 36] 36.2 Sort Fields: How sort Sorts </TITLE><METANAME="DC.title"CONTENT="UNIX Power Tools"><METANAME="DC.creator"CONTENT="Jerry Peek, Tim O'Reilly & Mike Loukides"><METANAME="DC.publisher"CONTENT="O'Reilly & Associates, Inc."><METANAME="DC.date"CONTENT="1998-08-04T21:48:38Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-260-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch36_01.htm"TITLE="36. Sorting"><LINKREL="prev"HREF="ch36_01.htm"TITLE="36.1 Putting Things in Order "><LINKREL="next"HREF="ch36_03.htm"TITLE="36.3 Changing the Field Delimiter "></HEAD><BODYBGCOLOR="#FFFFFF"TEXT="#000000"><DIVCLASS="htmlnav"><H1><IMGSRC="gifs/smbanner.gif"ALT="UNIX Power Tools"USEMAP="#srchmap"BORDER="0"></H1><MAPNAME="srchmap"><AREASHAPE="RECT"COORDS="0,0,466,58"HREF="index.htm"ALT="UNIX Power Tools"><AREASHAPE="RECT"COORDS="467,0,514,18"HREF="jobjects/fsearch.htm"ALT="Search this book"></MAP><TABLEWIDTH="515"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch36_01.htm"TITLE="36.1 Putting Things in Order "><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT="Previous: 36.1 Putting Things in Order "BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1">Chapter 36<BR>Sorting</FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch36_03.htm"TITLE="36.3 Changing the Field Delimiter "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 36.3 Changing the Field Delimiter "BORDER="0"></A></TD></TR></TABLE> <HRALIGN="LEFT"WIDTH="515"TITLE="footer"></DIV><DIVCLASS="SECT1"><H2CLASS="sect1"><ACLASS="title"NAME="UPT-ART-2925">36.2 Sort Fields: How sort Sorts </A></H2><PCLASS="para"><ACLASS="indexterm"NAME="UPT-ART-2925-IX-SORT-COMMAND-DESCRIBED"></A><ACLASS="indexterm"NAME="UPT-ART-2925-IX-SORT-COMMAND-FIELDS"></A>Unless you tell it otherwise, <EMCLASS="emphasis">sort</EM> divides each line into fieldsat white space (blanks or tabs),and sorts the lines, by field, from left to right. </P><PCLASS="para">That is, it sorts onthe basis of field 0 (leftmost); but when the leftmost fields arethe same, it sorts on the basis of field 1; and so on.This is hard to put into words, but it's really just common sense.Suppose your office inventory manager created a file like this:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">supplies pencils 148furniture chairs 40kitchen knives 22kitchen forks 20supplies pens 236furniture couches 10furniture tables 7supplies paper 29</PRE></BLOCKQUOTE></P><PCLASS="para">You'd want all the supplies sorted into categories and within eachcategory, you'd want them sorted alphabetically:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">% <CODECLASS="userinput"><B>sort supplies</B></CODE>furniture chairs 40furniture couches 10furniture tables 7kitchen forks 20kitchen knives 22supplies paper 29supplies pencils 148supplies pens 236</PRE></BLOCKQUOTE></P><PCLASS="para">Of course, you don't always want to sort from left to right. Thecommand line option <EMCLASS="emphasis">+n</EM> tells <EMCLASS="emphasis">sort</EM> to start sorting onfield <EMCLASS="emphasis">n</EM>; <EMCLASS="emphasis">-n</EM> tells <EMCLASS="emphasis">sort</EM> to stop sorting on field<EMCLASS="emphasis">n</EM>. Remember (again) that <EMCLASS="emphasis">sort</EM> counts fields from left toright, starting with 0.[1]Here's an example. We want to sort a list of telephone numbers of authors, presidents, and blues singers:</P><BLOCKQUOTECLASS="footnote"><PCLASS="para">[1] I harp on this because I always get confused and have to look it up inthe manual page.</P></BLOCKQUOTE><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">Robert M Johnson 344-0909Lyndon B Johnson 933-1423Samuel H Johnson 754-2542Michael K Loukides 112-2535Jerry O Peek 267-2345Timothy F O'Reilly 443-2434</PRE></BLOCKQUOTE></P><PCLASS="para">According to standard "telephone book rules," we want these namessorted by last name, first name, and middle initial. We don'twant the phone number to play a part in the sorting.So we want to start sorting on field 2, stop sorting on field 3,continue sorting on field 0, sort on field 1, and (just to make sure)stop sorting on field 2 (the last name). We can code this as follows: </P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">% <CODECLASS="userinput"><B>sort +2 -3 +0 -2 phonelist</B></CODE>Lyndon B Johnson 933-1423Robert M Johnson 344-0909Samuel H Johnson 754-2542Michael K Loukides 112-2535Timothy F O'Reilly 443-2434Jerry O Peek 267-2345</PRE></BLOCKQUOTE></P><PCLASS="para">A few notes:</P><ULCLASS="itemizedlist"><LICLASS="listitem"><PCLASS="para">We need the <EMCLASS="emphasis">-3</EM> option to prevent <EMCLASS="emphasis">sort</EM> from sorting on thetelephone number after sorting on the last name. Without <EMCLASS="emphasis">-3</EM>,the "Robert Johnson" entry would appear before "Lyndon Johnson"because it has a lower phone number.</P></LI><LICLASS="listitem"><PCLASS="para">We don't need to state <EMCLASS="emphasis">+1</EM> explicitly. Unless you give anexplicit "stop" field, <EMCLASS="emphasis">+1</EM> is implied after <EMCLASS="emphasis">+0</EM>.</P></LI><LICLASS="listitem"><PCLASS="para">If two names are completely identical, we probably don't care whathappens next. However, just to be sure that something unexpecteddoesn't take place, we end the option list with <EMCLASS="emphasis">-2</EM>, which says,"After sorting on the middle initial, don't do any further sorting."</P></LI></UL><PCLASS="para">There are a couple of variations that are worth mentioning. You maynever need them unless you're really serious about sorting data files,but it's good to keep them in the back of your mind. First, you canadd any "collation" operations (discard blanks, numeric sort, etc.) tothe end of a field specifier to describe how you want that fieldsorted. Using our previous example, let's say that if two names<EMCLASS="emphasis">are</EM> identical, you want them sorted in numeric phone numberorder. The following command does the trick:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">% <CODECLASS="literal">sort +2 -3 +0 -2 +3n phonelist</CODE></PRE></BLOCKQUOTE></P><PCLASS="para">The <EMCLASS="emphasis">+3n</EM> option says "do a numeric sort on the fourth field."If you're worried about initial blanks (perhaps some of the phonenumbers have area codes), use <EMCLASS="emphasis">+3nb</EM>.</P><PCLASS="para">Second, you can specify individual columns within any field forsorting, using the notation <EMCLASS="emphasis">+n.c</EM>, where <EMCLASS="emphasis">n</EM> is a fieldnumber, and <EMCLASS="emphasis">c</EM> is a character position within the field.Likewise, the notation <EMCLASS="emphasis">-n.c</EM> says "stop sorting at the characterbefore character <EMCLASS="emphasis">c</EM>."If you're counting characters, be sure touse the <EMCLASS="emphasis">-b</EM> (ignore white space) option - otherwise, it will bevery difficult to figure out what character you're counting.<ACLASS="indexterm"NAME="AUTOID-41541"></A></P><DIVCLASS="sect1info"><PCLASS="SECT1INFO">- <SPANCLASS="authorinitials">ML</SPAN></P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="515"TITLE="footer"><TABLEWIDTH="515"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch36_01.htm"TITLE="36.1 Putting Things in Order "><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT="Previous: 36.1 Putting Things in Order "BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><ACLASS="book"HREF="index.htm"TITLE="UNIX Power Tools"><IMGSRC="gifs/txthome.gif"SRC="gifs/txthome.gif"ALT="UNIX Power Tools"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch36_03.htm"TITLE="36.3 Changing the Field Delimiter "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 36.3 Changing the Field Delimiter "BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172">36.1 Putting Things in Order </TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><ACLASS="index"HREF="index/idx_0.htm"TITLE="Book Index"><IMGSRC="gifs/index.gif"SRC="gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172">36.3 Changing the Field Delimiter </TD></TR></TABLE><HRALIGN="LEFT"WIDTH="515"TITLE="footer"><IMGSRC="gifs/smnavbar.gif"SRC="gifs/smnavbar.gif"USEMAP="#map"BORDER="0"ALT="The UNIX CD Bookshelf Navigation"><MAPNAME="map"><AREASHAPE="RECT"COORDS="0,0,73,21"HREF="../index.htm"ALT="The UNIX CD Bookshelf"><AREASHAPE="RECT"COORDS="74,0,163,21"HREF="index.htm"ALT="UNIX Power Tools"><AREASHAPE="RECT"COORDS="164,0,257,21"HREF="../unixnut/index.htm"ALT="UNIX in a Nutshell"><AREASHAPE="RECT"COORDS="258,0,321,21"HREF="../vi/index.htm"ALT="Learning the vi Editor"><AREASHAPE="RECT"COORDS="322,0,378,21"HREF="../sedawk/index.htm"ALT="sed & awk"><AREASHAPE="RECT"COORDS="379,0,438,21"HREF="../ksh/index.htm"ALT="Learning the Korn Shell"><AREASHAPE="RECT"COORDS="439,0,514,21"HREF="../lrnunix/index.htm"ALT="Learning the UNIX Operating System"></MAP></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -