Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
續一周沒怎么更新了,今天我們繼續HTML的學習,表格標簽。表格是實際開發中常用的一種標簽類型,會說到表格標簽的主要作用和基本語法。
主要作用: 表格主要用于顯示、展示數據,因為它可以讓數據展示的非常規整,可讀性非常好,特別是后臺展示數據的時候,能夠熟練運用表格非常重要。一個清爽簡約的表格可以把復雜的數據表現的很簡單。表格不是用來布局頁面的,而是用來展示數據的。
表格的基本語法: <table><tr><td></td></tr></table>
<table></table>用來定義表格標簽
<tr></tr>用于定義表格中的行,嵌套在<table>標簽中使用
<td></td>用于定義表格中的單元格,嵌套在<tr>標簽中使用,字母td指表格數據(table data),即數據單元格的內容。
我們來展示一個例子,比如 數據庫中有三個字段,分別為 姓名 性別和年齡,如果想用前端將這三個字段的數據展示出來,應該怎么操作呢?
先看效果:
然后我們看下代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>20210829---</title>
</head>
<body>
<table>
<tr> <td>姓名</td> <td>性別</td> <td>年齡</td> </tr>
</table>
</body>
</html>
這次開始使用vs code來編輯代碼了,感覺比sublime line高級一些,但是相對的也麻煩點。可以看到,在前端頁面展示了 姓名、性別和年齡。然后我們添加一行數據,看效果:
民族英雄黃飛鴻如果還活著,應該也是一位非常高壽的宗師了。多加幾個數據
讓我們看看代碼有什么不同
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>20210829---</title>
</head>
<body>
<table>
<tr> <td>姓名</td> <td>性別</td> <td>年齡</td> </tr>
<tr> <td>黃飛鴻</td> <td>男</td> <td>188</td> </tr>
<!--再多創建幾個數據-->>
<tr><td>鬼腳七</td> <td>男</td> <td>186</td> </tr>
<tr><td>梁寬</td> <td>男</td> <td>33</td> </tr>
</table>
</body>
</html>
可以看到,就是將之前的數據進行了復制而已。
接著我們說下表頭單元格標簽,一般表頭單元格位于表頭的第一行或第一列,表頭單元格里面的文本內容,加粗居中表示。
<th>標簽表示HTML表格的表頭部分,table head的縮寫
我們先來看下效果:
再看下對應的代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>20210829---</title>
</head>
<body>
<table>
<!--HTML表格的表頭標簽,內容加粗居中展示-->>
<tr> <th>姓名</th> <th>性別</th> <th>年齡</th> </tr>
<tr> <td>黃飛鴻</td> <td>男</td> <td>188</td> </tr>
<!--再多創建幾個數據-->>
<tr><td>鬼腳七</td> <td>男</td> <td>186</td> </tr>
<tr><td>梁寬</td> <td>男</td> <td>33</td> </tr>
</table>
</body>
</html>
就是將表格表頭那一行的<td>都換成了<th>,可以看到表頭每個字段都已經居中并且加粗了。
最后我們說下表格的屬性,其實表格標簽屬性這部分用的不多,一般都是用css樣式來設置。例如表格的邊框、大小等。我們需要關注的表格屬性目的,有2點:
align 屬性值: left right center 對應表格相對周圍元素的對齊方式
border 屬性值 1或"" (空) 規定表格單元是否有邊框,默認為空,表示沒有邊框
cellpadding 像素值 規定單元邊沿與其內容之間的空白,默認1像素
cellspacing 像素值 規定單元格之間的空白,默認1像素
width 像素值或百分比 規定表格的寬度
我們來看下效果:
來看下代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>20210829---</title>
</head>
<body>
<table align="center" border=1 cellpadding=1 cellspacing=1 width=500>
<!--HTML表格的表頭標簽,內容加粗居中展示-->>
<tr> <th>姓名</th> <th>性別</th> <th>年齡</th> </tr>
<tr> <td>黃飛鴻</td> <td>男</td> <td>188</td> </tr>
<!--再多創建幾個數據-->>
<tr><td>鬼腳七</td> <td>男</td> <td>186</td> </tr>
<tr><td>梁寬</td> <td>男</td> <td>33</td> </tr>
</table>
</body>
</html>
記住,屬性都是在table處添加和修改的,因為我們是對整個table的設置值。
好的,今天就先到這里了,大家周末愉快
T ___ InformationTechnology 信息技術
POP ___ Procedure-Oriented Programming 面向過程編程
OOA ___ Object Oriented Analysis 面對對象分析
OOD ___ Object Oriented Design 面對對象設計
OOP ___ Object Oriented Programming 面向對象編程
IOP ___ Interface-Oriented Programming 面向接口編程
AOP ___ Aspect Oriented Programming 面向切面編程
SOA ___ service-oriented architecture 面向服務的體系結構
IDE ___ Integrated Development Environment 集成開發環境
GUI ___ Graphical User Interface 圖形用戶界面
API ___ Application Programming Interface 應用編程接口
COM ___ Component Object Model 組件對象模型
dll ___ dynamic linked library 動態鏈接庫
GDI ___ Graphics Device Interface 圖形設備接口
GUI ___ Graphics Unser Interface 圖形用戶界面
Big O notation ___ Order 階,Order of Growth, lower- order, high - order
DOS ___Disc Operating System 磁盤操作系統
UML ___ nified Modeling Language統一建模語言
MVC ___ Model–view–controller 模型、視圖和控制器,MVC 模式的目的是實現一種動態的程序設計。
.net ___ NET Framework .Net框架,是由微軟開發,一個致力于敏捷軟件開發(Agile software development)、快速應用開發(Rapid application development)、平臺無關性和網絡透明化的軟件開發平臺。.NET框架是以一種采用系統虛擬機運行的編程平臺,以通用語言運行庫(Common Language Runtime)為基礎,支持多種語言(C#、VB、C++、Python等)的開發。NET也為應用程序接口(API)提供了新功能和開發工具。這些革新使得程序設計員可以同時進行Windows應用軟件和網絡應用軟件以及組件和服務(web服務)的開發。.NET提供了一個新的反射性的且面向對象程序設計編程接口。.NET設計得足夠通用化從而使許多不同高級語言都得以被匯集。.NET Framework中的所有語言都提供基類庫(BCL)。
目錄:
0 匯編
1 C
2 C++
3 VC里面的一些類型定義和縮寫
4 Java
5 數據結構與算法
6 HTML、CSS、Javascript
7 數據庫相關
8 網絡和服務端編程相關
9 硬件相關
10 others
11 附
lea ___ Load effective address
je ___ Jump if equal
leave—Leave function
mov rsp, rbp
pop rbp
jmp ___ Jump
jne ___ Jump Not Equal
jng ___ Jump Not greater than
jnl ___ Jump Not less than
jo ___ Jump Overflow
jnc ___ Jump No carry
inc ___ Increment Adds 1 to a variable.
BSS ___ Block Started by Symbol, Better Save Space
typedef ___ type definition
malloc() ___ memory allocate
atof() ___ anscii to float
seekp() ___ seek put pointer
seekg() ___ seek get pointer
strpbrk() ___ string pointer break
strcspn() ___ string complement span
isxdigit() ___ is hexadecimal digit
strtok() ___ string to tokenize
strrchr() ___ string right character
isalnurn() ___ is alpha and numeric?
isalpha() ___ is alphabetic?
#ifndef ___ if not defined
gdb___ GNU Debugger
RAII ___ Resource Acquisition Is Initialization 資源獲取即初始化
RTTI ___ Run-Time Type Identification 運行時類型識別
STL ___ Standard Template Library
ios::app ___ appends: Always appends at the end when writing
ios::ate ___ at end: Positions at the end of the file after opening
ios::trunc ___ truncate: Removes the former file contents
IOC ___ Inversion of Control 控制反轉,是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。
deque ___ double ended queue
POD ___ Plain Old Data 傳統的C風格的struct叫做POD對象。其二進制內容是可以隨便復制的,在任何地方,只要其二進制內容在,就能還原出正確無誤的POD對象。memcpy,memset有很強的限制,僅能用于POD結構,不能作用于stl容器或者帶有虛函數的類。帶虛函數的類對象會有一個虛函數表的指針,memcpy將破壞該指針指向。
MFC ___ Microsoft Foundation Classes 微軟基礎類庫,是一個微軟公司提供的類庫(class libraries),以C++類的形式封裝了Windows的API,并且包含一個應用程序框架,以減少應用程序開發人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內建控件和組件的封裝類。
WPF___ Windows Presentation Foundation 微軟推出的基于Windows Vista的用戶界面框架,屬于.NET Framework 3.0的一部分。它提供了統一的編程模型、語言和框架,真正做到了分離界面設計人員與開發人員的工作;同時它提供了全新的多媒體交互用戶圖形界面。
LPCTSTR 是Win32 自定義數據類型, 是以null 結尾的字符串。
void CWnd::SetWindowText(LPCTSTR lpszString);
LP 表示長指針,在Win32 系統中指針沒有長短之分,LP 和P 等同。
C 表示const 常量。
T 表示TCHAR。
STR 表示字符串, 等同于const TCHAR *。
sz: string terminated with zero由于字符集分為ANSI 和Unicode 兩種,對應char 和wchar_t 兩種字符類型,TCHAR 是個宏定義,它根據開發環境的設置不同自動替換為char 或wchar_t, 使用TCHAR可以增強程序的可移植。
cbWndExtra ___ count of byte
GetDeviceCaps ___ Get Device's Capacities
WM_NCHITTEST ___ Not Client
DefWindowProc ___ Default
WM_TIMER ___ Windows Message
CBN_SELCHANGE ___ comboBox Notify
variable nam-ing notation:
b Boolean (true or false)
w Word, 16-bit integer
i Integer, 16-bit integer (conflicts with w )
n Short, 16-bit integer (conflicts with w )
n Near pointer (ambiguous, can be used for " short ")
p Pointer
d Double, 32-bit integer
dw Double word, 32-bit integer (conflicts with d)
l Long, 32-bit integer (conflicts with d )
fn Function (or pointer to function)
g Global
s String
sz String terminated with zero (conflicts with s )
c character
by byte (unsigned character)
h Window handle
hn Window handle (conflicts with h )
JDK ____ Java Development Kit, The software for consumers who want to run Java programs.
JRE ___ Java Runtime Environment, The software for running Java programs on servers.
SE ___ Standard Edition, The Java platform for use on desktops and simple server applications.
EE ___ Enterprise Edition, The Java platform for complex server applications.
ME ___ Micro Edition, The Java platform for use on cell phones and other small devices.
AWT ___ Abstract Windowing Toolkit 抽象窗口工具包
JAR ___ Java ARchive
GC ___ Garbage Collection 一種自動的內存管理機制。
FIFO ___ First Input First Output,先入先出(隊列)
LIFO ___ last in,first out,后進先出(棧)
BST ___ binary search tree,二叉搜索樹
DFS ___Deepness First Search,深度優先搜索
BFS ___ Breadth-First Search,廣度優先搜索算法
DP ___ Dynamic Programming,動態規劃算法,一種實現記憶搜索的分治法
AVL trees ___ were invented in 1962 by two Russian computer scientists, G. M. Adelson-Velsky and E. M. Landis. An AVL tree is a well-balanced binary tree. In an AVL tree, the difference between the heights of two subtrees for every node is 0 or 1.
KMP algorithm ___ The Knuth-Morris-Pratt algorithm
HTTP ___ HyperText Transfer Protocol 超文本傳輸協議,是一種用于分布式、協作式和超媒體信息系統的應用層協議。HTTP是萬維網的數據通信的基礎。
CSS ___ Cascading Style Sheet 級聯樣式表,是用來進行網頁風格設計的。比如,如果想讓鏈接字未點擊時是藍色的,當鼠標移上去后字變成紅色的且有下劃線,這就是一種風格。通過設立樣式表,可以統一地控制HMTL中各標志的顯示屬性。級聯樣式表可以使人更能有效地控制網頁外觀。使用級聯樣式表,可以擴充精確指定網頁元素位置,外觀以及創建特殊效果的能力。
AJAX ___ Asynchronous JavaScript and XML”(異步的 JavaScript 與 XML 技術),指的是一套綜合了多項技術的瀏覽器端網頁開發技術。
JSON ___ JavaScript Object Notation 一種輕量級的數據交換語言,以文字為基礎,且易于讓人閱讀。盡管 JSON 是 Javascript 的一個子集,但JSON是獨立于語言的文本格式,并且采用了類似于 C語言 家族的一些習慣。
XML ___ eXtensible Markup Language 可擴展標記語言,是一種標記語言。標記指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種信息的文章等。如何定義這些標記,既可以選擇國際通用的標記語言,比如HTML,也可以使用像XML這樣由相關人士自由決定的標記語言,這就是語言的可擴展性。XML是從標準通用標記語言(SGML)中簡化修改出來的。它主要用到的有可擴展標記語言、可擴展樣式語言(XSL)、XBRL和XPath等。
ASP ___ Active Server Page 動態服務器頁面,是微軟公司開發的代替CGI腳本程序的一種應用,它可以與數據庫和其它程序進行交互,是一種簡單、方便的編程工具,運行于 IIS 之中的程序。ASP的網頁文件的格式是.asp,常用于各種動態網站中。
DOM ___ Document Object Model 文檔目標模型
NaN ___ Not a Number
<a></a> ___ anchor
<h3></h3> ___ header level 3
<p></p> ___ paragraph
<tr></tr> ___ table row
<th></th> ___ table head
<td></td> ___ table data
DML ___ Data Manipulation Language 數據操縱語言 SQL 語言中,負責對數據庫對象運行數據訪問工作的指令集,以 INSERT、UPDATE、DELETE 三種指令為核心,分別代表插入、更新與刪除,是開發以數據為中心的應用程序必定會使用到的指令,因此有很多開發人員都把加上SQL的SELECT語句的四大指令以“CRUD”來稱呼
ADO ___ ActiveX Data Objects) 是一個用于存取數據源的COM組件。它提供了編程語言和統一數據訪問方式OLE DB的一個中間層。允許開發人員編寫訪問數據的代碼而不用關心數據庫是如何實現的,而只用關心到數據庫的連接。
SQL ___ Structured Query Language 結構化查詢語言,是一種特定目的程序語言,用于管理關系數據庫管理系統(RDBMS),或在關系流數據管理系統(RDSMS)中進行流處理。
NoSQL 是對不同于傳統的關系數據庫的數據庫管理系統的統稱。
DNS ___ Domain Name System 域名系統,是互聯網的一項服務。它作為將域名和IP地址相互映射的一個分布式數據庫,能夠使人更方便地訪問互聯網。DNS使用TCP和UDP端口53。當前,對于每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符。
CGI ___ Common Gateway Interface 通用網關接口,是一個Web服務器主機提供信息服務的標準接口。通過CGI接口,Web服務器就能夠獲取客戶端提交的信息,轉交給服務器端的CGI程序進行處理,最后返回結果給客戶端。組成CGI通信系統的是兩部分:一部分是html頁面,就是在用戶端瀏覽器上顯示的頁面。另一部分則是運行在服務器上的Cgi程序。servlet是CGI替代品。
IIS ___ Internet Information Services 互聯網信息服務,是由微軟公司提供的基于運行Microsoft Windows的互聯網基本服務。最初是Windows NT版本的可選包,隨后內置在Windows 2000、Windows XP Professional和Windows Server 2003一起發行,但在Windows XP Home版本上并沒有IIS。
C/S ___ Client/Server 客戶端-服務器架構,是一種網絡架構,它把客戶端 (Client) (通常是一個采用圖形用戶界面的程序)與服務器 (Server) 區分開來。每一個客戶端軟件的實例都可以向一個服務器或應用程序服務器發出請求。有很多不同類型的服務器,例如文件服務器、游戲服務器等。
FTP ___ File Transfer Protocol 文件傳輸協議
ADSL ___ Asymetrical Digital Subscriber Line 非對稱數字用戶線路
ARP ___ Address resolution Protocol 地址解析協議
ICMP ___ Internet Control and Message Protocol Internet控制消息協議
ICP ___ Internet Content Provider 互聯網內容供應商
IMAP ___ Internet message Access Protocol 報文存取協議
IP ___ Internet Protocol 網際協議
LAN ___ Local Area Network 局域網
PING ___ Packet Internet Grable
PPPOE ___ Point to Point Protocol Over Ethernet
POP3 ___ Post Office Protocol Version 3
CPU ___ Central Process Unit 中央處理單元
ALU ___ arithmetic and logic unit 算術邏輯單元
BIOS ___ Basic Input Output System 基本輸入輸出系統
ROM ___ Rread_Only Memory 只讀存儲器
EPROM ___ erasable programmable ROM 可擦寫可編程ROM
SRAM ____ Static Ramdom Access Memory 靜態隨機存儲器
GPU Graphic Processing Unit
PCI ___ Peripheral component Interconnection 互聯外圍設備
DPI Dots Per Inch 每英寸點數
JVM ___ Java Virtual Machine Java 虛擬機,是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。 JVM屏蔽了與具體操作系統平臺相關的信息,使Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。JVM在執行字節碼時,實際上最終還是把字節碼解釋成具體平臺上的機器指令執行。編譯虛擬機的指令集與編譯微處理器的指令集非常類似。
RA ___ Requirement Analysis 需求分析
IEEE___ Institute of Electrical and Electronic Engineer 電子電氣工程師協會
GIF ___ Graphics Interchange Format
JPEG ___ Joint Photographic Expert Group 一個靜態圖壓縮標準
MP3 ___ MPEG Audio Layer3
MPEG ___ Moving Picture Expert Group 動態圖像專家
OCR Optical Character Recognition 光學字符識別
OLE ObjectLinking and Embedding 對象連接與嵌入,簡稱OLE技術
PDF ___ Portal Document Format 可移植文檔格式
PHP ___ Hypertext Proprocessor 超文本預處理器
PNP ___ Plug and Play
POST ____ Power On Self Test
11.1 英文縮寫搜索
http://m.shortof.com/
11.2 一些英文縮寫
縮寫 | 全稱 |
addr | Address |
adm | Administrator |
app | Application |
arg | Argument |
asm | assemble |
asyn | asynchronization |
avg | average |
DB | Database |
bk | back |
bmp | Bitmap |
btn | Button |
buf | Buffer |
calc | Calculate |
char | Character |
chg | Change |
clk | Click |
clr | color |
cmd | Command |
cmp | Compare |
col | Column |
coord | coordinates |
cpy | copy |
ctl / ctrl | Control |
cur | Current |
cyl | Cylinder |
dbg | Debug |
dbl | Double |
dec | Decrease |
def | default |
del | Delete |
dest / dst | Destination |
dev | Device |
dict | dictionary |
diff | different |
dir | directory |
disp | Display |
div | Divide |
dlg | Dialog |
doc | Document |
drv | Driver |
dyna | Dynamic |
env | Environment |
err | error |
ex/ext | Extend |
exec | execute |
flg | flag |
frm | Frame |
func / fn | Function |
grp | group |
horz | Horizontal |
idx / ndx | Index |
img | Image |
impl | Implement |
inc | Increase |
info | Information |
init | Initial/Initialize/Initialization |
ins | Insert |
inst | Instance |
INT / intr | Interrupt |
len | Length |
lib | Library |
lnk | Link |
log | logical |
lst | List |
max | maximum |
mem | Memory |
mgr / man | Manage / Manager |
mid | middle |
min | minimum |
msg | Message |
mul | Multiply |
num | Number |
obj | Object |
ofs | Offset |
org | Origin / Original |
param | Parameter |
pic | picture |
pkg | package |
pnt / pt | Point |
pos | Position |
pre / prev | previous |
prg | program |
prn | |
proc | Process / Procedure |
prop | Properties |
psw | Password |
ptr | Pointer |
pub | Public |
rc | rect |
ref | Reference |
reg | Register |
req | request |
res | Resource |
ret | return |
rgn | region |
scr | screen |
sec | Second |
seg | Segment |
sel | Select |
src | Source |
std | Standard |
stg | Storage |
stm | Stream |
str | String |
sub | Subtract |
sum | summation |
svr | Server |
sync | Synchronization |
sys | System |
tbl | Table |
temp / tmp | Temporary |
tran / trans | translate/transation/transparent |
tst | Test |
txt | text |
unk | Unknown |
upd | Update |
upg | Upgrade |
util | Utility |
var | Variable |
ver | Version |
vert | Vertical |
vir | Virus |
wnd | Window |
-End-
- 作者 謝恩銘 轉載請注明出處
《Linux探索之旅》全系列
內容簡介
前言
成果展示
解題步驟和答案
可能的優化
第五部分第九課預告
1. 前言
上一課 Linux探索之旅 | 第五部分第七課:Shell實現圖片展示網頁 中,我們做了一個有趣的練習。
這個練習用一個 Shell 腳本來生成一個 HTML 文件,這個 HTML 文件是一個展示圖片縮略圖的網頁,點擊每個縮略圖還會鏈接到原始圖片。
這一課我們繼續做一個進階的 Shell 腳本練習。這個練習要實現的是對一個英語字典做統計。
通過這個練習,你將鞏固 Shell 和 Linux 的知識點。
為了完成它,我們需要用到一個文本文件:words.txt。這是一個包含 354935 個英文單詞的字典,請從我的 Github 上下載 (下面也會給出百度云盤下載鏈接):
https://github.com/frogoscar/english-dictionary
你可以選擇 git clone 到你本地目錄,或者下載 zip 壓縮包。然后提取里面的 words.txt 文件即可。
對于 Git 和 Github 的使用有任何疑問,歡迎閱讀我的文章 :Git,Github和Gitlab簡介和基本使用
對于不用 Github 的朋友,我也把字典文件上傳到百度云盤了,請 點我下載 。
當然了,如果你自己能在網上找到其他完整的英文字典的文本文檔也可以,不一定要用我這個。
2. 成果展示
我們要用到的字典文本文檔里的內容類似如下:
字典開頭
字典結尾
我們要寫一個 Shell 腳本,來顯示這個龐大的字典中 26 個英文字母(從 a 到 z )出現的次數,而且以次數最多到最少的順序排列。
成果是像下面這樣的:
可以看到,字母 e 出現的次數最多,是 363325 次; 字母 j 出現的次數最少,是 5073 次。
下面給出我的解題步驟和答案,希望大家最好先不看答案,嘗試著自己解決問題,然后再來看答案。
你的解法也許比我還要好。相信你可以的,加油!
3. 解題步驟和答案
首先,我們創建一個文件夾,然后把 words.txt 這個字典文件放進去。
然后,我們在文件夾中創建一個文件,就是我們的腳本,叫 statistics.sh 好了,因為 statistics 是英語「統計」的意思。
vim statistics.sh
因為這個練習涉及到數據的處理,所以可以回去參考 Linux探索之旅 | 第三部分第一課:數據處理,慢條斯理 那一課。
還有 「管道、流、重定向」 ( Linux探索之旅 | 第三部分第二課:流、管道、重定向,三管齊下 )等等。
你也許還會在使用一些命令時忘了如何用,那你可以查一下命令的使用手冊 ( Linux探索之旅 | 第二部分第八課:RTFM 閱讀那該死的手冊 )。
根據上面的成果那張截圖,我們可以看到要實現的是 :
「在終端打印出結果,按照字母出現的次數來排列,由最多到最少。在次數左邊,依次是 該次數對應的字母、空格、短橫杠、空格。而且每個字母是大寫的(在字典文件中字母都是小寫,因此需要小寫到大寫的轉換)」。
因此,我們首先需要統計每個字母出現的次數。
怎么做呢?我們想到了 grep 命令,它可以幫助我們在文件中查找所需的字母。
我們首先用命令行來測試,之后再著手編寫我們的 statistics.sh 這個文件。
首先,在命令行中輸入以下命令:
grep -io a words.txt
回車運行后可以看到輸出了許多行,每一行包含一個 a。
因為 grep 就是用于在文件中查找關鍵字,并且顯示關鍵字所在的行。
這里我們用了 -i 和 -o 兩個參數。-i 參數我們之前學過,是 ignore-case 的簡寫,表示「忽略大小寫」。
而-o 這個參數我們之前沒學過,不過可以用 man grep
來看看:
man grep
可以看到 -o 參數中的 o 是英語 only-matching 的簡寫,表示「只匹配」。其描述 「 Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. 」可以翻譯為 「只顯示匹配行中不為空的那個匹配的部分,每個這樣的部分被單獨顯示在一行上」。
如果不加 -o 參數而直接用
grep -i a words.txt
那么輸出是這樣的:
理解了嗎?不加 -o 參數,那么 grep 就會輸出每一個包含 a 的行。而每一行 (字典文件中一行有一個單詞)也許包含不止一個 a。因此為了統計所有的 a,我們須要加上 -o 參數。
既然我們已經用 grep -io a words.txt
命令來輸出了所有字母 a 的 出現(逐行顯示),那么我們可以用 wc -l
命令來統計行數,即可知道 a 的出現次數了。
接下來我們就用管道來把 grep 命令的結果賦給 wc 命令:
grep -io a words.txt | wc -l
可以看到輸出是 273400,表示 words.txt 文件中字母 a 出現了 273400 次。
我們也可以不加 -o 參數來測試一下:
grep -i a words.txt | wc -l
可以看到輸出是 206518,比 273400 少了很多,因為不加 -o 參數只統計了 a 出現的那些行(相當于統計了包含 a 的單詞數目),而不是統計 a 的真正出現次數。
我們現在已經知道如何統計字母 a 的次數了,那么舉一反三,統計其他 25 個字母也不在話下。我們可以用一個循環語句來實現:
for char in {a..z}; do
可以看到我們在終端輸入 for 循環語句后,依次打印出了 a, b, c, 一直到 z 這 26 個字母在 words.txt 文件中出現的次數。
雖然現在我們只是開了個頭,但是已經可以來寫我們的 Shell 腳本了。
我們首先寫一些基礎的部分:
#!/bin/bash# Verification of parameter# 確認參數if [ -z ]
上面兩段代碼分別用于確認參數和確認文件存在,如果不滿足 if 條件,那么用 echo 顯示提示信息,然后用 exit 命令退出 Shell。
然后,我們來定義一個函數,就叫 statistics 好了,我們繼續在 statistics.sh 這個文件中加入以下代碼:
# Definition of function# 函數定義statistics () { for char in {a..z}
for char in {a..z}
不難理解,用于遍歷 a 到 z 這 26 個英語字母。
echo "$char - `grep -io "$char" | wc -l`"
這句首先用 echo 命令輸出 char 變量的值 (依次取值 a 到 z ),然后輸出一個空格,輸出短橫杠,再輸出一個空格,然后輸出 grep -io "$char" | wc -l
這句命令的運行結果,也就是 char 變量對應的字母的出現次數 。
我們運行這個腳本(別忘了用 chmod +x statistics.sh
為腳本加上可執行權限):
./statistics.sh words.txt
可以看到我們的腳本文件如我們所愿從 a 到 z 輸出了這 26 個字母,格式也是我們需要的:
字母 - 出現次數
但是,目前我們的字母沒有大寫,而且還不是按出現次數最多到最小排序的,因此我們還要繼續探索。
為了使 echo 命令的輸出中的小寫字母被轉成大寫,我們可以用 tr 命令。tr 是 translate 的縮寫,表示「翻譯,轉化」。
我們的函數改為如下:
# Definition of function# 函數定義statistics () { for char in {a..z}
tr /a-z/ /A-Z/
表示把所有 a 到 z 的小寫字母轉為對應的大寫字母 A-Z。
這下我們的字母已經都變成大寫了,我們還剩最后一點沒做:對這 26 行輸出根據字母出現次數排序。
為了實現這個,我們需要用到 sort 命令,sort命令用于對文件的行進行排序。
我們還需要一個中轉的文件,用于暫時儲存我們的 echo 命令循環輸出的這 26 行數據。
因此我們可以用輸出重定向來把 echo "$char - `grep -io "$char" | wc -l`" | tr /a-z/ /A-Z/
的結果依次寫入一個文件,比如取名為 tmp.txt。
然后再用 sort 命令對這個文件的行進行排序,把排序結果顯示到終端。
我們的函數改為如下:
# Definition of function# 函數定義statistics () { for char in {a..z}
我們在 echo "$char - `grep -io "$char" | wc -l`" | tr /a-z/ /A-Z/
之后加了 >> tmp.txt
,以把輸出重定向到文件 tmp.txt 末尾。
然后用 sort 命令對 tmp.txt 文件中的行進行排序。
我們用了 sort 命令的 -r,-n,-k 和 -t 四個參數。
其中 -r 和 -n 參數我們比較熟悉,-n 參數用于對數字排序,-r 參數用于倒序排列。
-k 參數用于指定根據哪幾列進行排序,這里用 -k 2
表示根據第 2 列來排序。
-t 參數用于指定列和列之間用什么作為分隔符,這里用 -t -
表示分隔符是 - 。
然后每次我們都要把 tmp.txt 這個臨時文件刪除,用 rm tmp.txt
。
我的最終代碼:
#!/bin/bash# Verification of parameter # 確認參數if [ -z $1 ]
上面只是我的解法,你的解題思路和代碼當然不必和我一樣。而且我也非常肯定我的代碼不夠優。
我相信各位能想出更好的解法,歡迎留言補充(如果留言支持代碼,可以把你的代碼貼出來)。
這個程序雖然短小,但是我們用到了 Linux 中的 grep 命令,sort 命令,wc 命令,rm 命令,echo 命令,exit 命令,管道 ( | ),重定向( >> )。Shell 中的條件語句 ( if ),循環語句 ( for ),函數,等知識點。
4. 可能的優化
我給出的解方是基礎的,你可以自由發揮。
下面提出幾點優化的設想:
除了第一個參數,也就是要統計的字典文件的名字,我們還可以添加其他參數,來完成更多任務。
改變輸出的形式,使之更美觀。
每一行可以輸出更多信息。
嘗試不借助中間文件 tmp.txt。
其他優化,就有待大家去發揮自己的想象力咯!
5. 第五部分第九課預告
今天的課就到這里,一起加油吧!
下一課我們來做一些測試吧 :第五部分測試題
然后就進入第六部分了。
微信公眾號「程序員聯盟」ProgrammerLeague
我是[謝恩銘](http://www.jianshu.com/u/44339a8a9afa),在巴黎奮斗的軟件工程師。
[我的簡介](http://www.jianshu.com/p/e1c5835fee7d)
[我的經歷](http://www.jianshu.com/p/86c2cfe3b390)
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:“向著標桿直跑”
*請認真填寫需求信息,我們會在24小時內與您取得聯系。