成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux shell逐行處理文本求和,我人傻了...

系統(tǒng) Linux
本文要說(shuō)的點(diǎn)與awk無(wú)關(guān)。我們通過(guò)另外一種方式來(lái)計(jì)算,即逐行分析處理的方式。

[[406744]]

 假設(shè)要要計(jì)算文本test.data的第二列的數(shù)字之和: 

  1. 1 12   
  2. 2 23   
  3. 3 34   
  4. 4 56  

當(dāng)然你可能會(huì)這樣處理: 

  1. awk '{s+=$2} END {print s}' test.data  

很快就得到了結(jié)果。不過(guò),本文要說(shuō)的點(diǎn)與awk無(wú)關(guān)。我們通過(guò)另外一種方式來(lái)計(jì)算,即逐行分析處理的方式。

嘗試一

我們嘗試第一種方式,shell實(shí)現(xiàn)如下: 

  1. #!/usr/bin/env bash  
  2. sum=0  
  3. cat test.data | while read line  
  4. do  
  5.     temp_num=$(echo "$line" | cut -d ' ' -f 2)  
  6.     sum=$(( $sum + $temp_num ))  
  7. done  
  8. echo "we get sum:$sum" 

輸出結(jié)果:

  1. we get sum:0 

這是為什么!為什么得到的結(jié)果會(huì)是0呢?

這事壞就壞在腳本中的|,眾所周知,這是一個(gè)管道命令,而這也就意味著,while循環(huán)的執(zhí)行結(jié)果都是在一個(gè)subshell中,一旦這個(gè)subsell退出了,它里面的結(jié)果也就沒(méi)有了。

其實(shí)這個(gè)問(wèn)題利用有了這個(gè)神器,再也不怕shell寫(xiě)得不對(duì)了中提到的工具很容易發(fā)現(xiàn): 

  1. $ shellcheck myscript  
  2. Line 3: 
  3. cat test.data | while read line  
  4.     ^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.  
  5.                       ^-- SC2162: read without -r will mangle backslashes.  
  6. Line 6:  
  7.     sum=$(( $sum + $temp_num ))  
  8.     ^-- SC2030: Modification of sum is local (to subshell caused by pipeline).  
  9.             ^-- SC2004: $/${} is unnecessary on arithmetic variables.  
  10.                    ^-- SC2004: $/${} is unnecessary on arithmetic variables.  
  11. Line 8:  
  12. echo "we get sum:$sum"  
  13.                  ^-- SC2031: sum was modified in a subshell. That change might be lost.  

嘗試二

既然管道命令不建議用,那么我們使用下面的方式看看: 

  1. #!/usr/bin/env bash  
  2. sum=0  
  3. for line in $(cat test.data) 
  4. do  
  5.     echo "get line :$line"  
  6.     temp_num=$(echo "$line" | cut -d ' ' -f 2) 
  7.     sum=$(( $sum + $temp_num ))  
  8. done  
  9. echo "we get sum:$sum" 

輸出結(jié)果: 

  1. get line :1  
  2. get line :12  
  3. get line :2  
  4. get line :23  
  5. get line :3  
  6. get line :34  
  7. get line :4  
  8. get line :56  
  9. we get sum:135 

從結(jié)果中看出,如果文本中存在空格或者tab等,則看似每次讀取一行,實(shí)際上是遇到空格,tab或換行就停止讀取了,并沒(méi)有達(dá)到我們的目的。

我們預(yù)期的應(yīng)該是遇到換行才停止讀取,為了達(dá)到這個(gè)目的,我們可以設(shè)置這個(gè)標(biāo)記,即通過(guò)設(shè)置IFS來(lái)達(dá)到目的。在上面的shell開(kāi)頭加上: 

  1. IFS=$'\n' 

但是修改為這樣之后,在自己的系統(tǒng)上并沒(méi)有得到我想要的效果,有知道的讀者可以告知一下。

嘗試三

讓我們?cè)贀Q一種方式: 

  1. #!/usr/bin/env bash  
  2. sum=0  
  3. while read line  
  4. do  
  5.     echo "line $line"  
  6.     temp_num=$(echo "$line" | cut -d ' ' -f 2)  
  7.     sum=$(( $sum + $temp_num ))  
  8. done < "test.data"  
  9. echo "we get sum:$sum" 

這種方式我們是能得到正確結(jié)果的。

當(dāng)然,如果你要讀取指定列,你還可以像下面這樣做: 

  1. #!/usr/bin/env bash  
  2. sum=0  
  3. while read col1 col2  
  4. do  
  5.     sum=$(( $sum + $col2 ))  
  6. done < "test.data"  
  7. echo "we get sum:$sum" 

其中col1,col2就分別代表了第一列,第二列,使用的時(shí)候,可以直接使用對(duì)應(yīng)列的內(nèi)容。

但是,如果我們要讀取的內(nèi)容包括了轉(zhuǎn)義字符會(huì)怎么辦?例如: 

  1. \n 12  
  2. \n 23  
  3. \n 34  
  4. \n 56 

執(zhí)行結(jié)果: 

  1. line   
  2.  12  
  3. line   
  4.  23  
  5. line   
  6.  34  
  7. line   
  8.  56  
  9. we get sum:125 

從結(jié)果可以看到,雖然內(nèi)容能否讀取到,但是內(nèi)容被打印出來(lái)的時(shí)候,已經(jīng)變了,\被當(dāng)成轉(zhuǎn)義字符處理了,如果不想讓它轉(zhuǎn)義處理怎么辦?只需要加上-r參數(shù)即可: 

  1. while read -r line 

總結(jié)

在逐行處理文本過(guò)程中,主要關(guān)注以下幾種情況:

  •  行中有空格,tab
  •  行中有轉(zhuǎn)義字符

另外,通過(guò)shellcheck工具也會(huì)發(fā)現(xiàn),它并不推薦for in file這種方式逐行處理文本: 

  1. Line 3:  
  2. for line in $(cat test.data)  
  3.             ^-- SC2013: To read lines rather than words, pipe/redirect to a 'while read' loop.  

 

責(zé)任編輯:龐桂玉 來(lái)源: Linux學(xué)習(xí)
相關(guān)推薦

2021-06-09 07:15:20

Shell逐行處理

2021-06-07 12:10:14

Shell逐行處理

2017-03-02 18:10:20

LinuxShell命令

2016-03-30 11:16:33

2021-09-10 16:30:29

LinuxShell文本

2021-08-20 10:46:25

Shell腳本文件Linux

2021-04-21 08:03:34

腳本Shell讀取

2019-10-14 11:31:51

工具代碼開(kāi)發(fā)

2018-12-28 10:45:08

Linux文本行命令

2024-09-12 17:39:27

2013-10-30 10:35:29

Linux命令文本處理

2020-03-18 14:20:25

shellLinux命令

2021-01-28 08:12:15

Linux命令技巧

2024-01-07 16:46:19

FiberHTTPWeb

2017-12-18 10:12:48

LinuxShell命令

2022-08-01 21:38:25

Linux fmt命令

2024-08-12 09:43:42

2024-11-27 09:19:25

2013-07-16 16:37:12

91百度

2020-11-21 19:04:33

技術(shù)開(kāi)發(fā)指標(biāo)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜影晥 | 亚洲国产二区 | 国产精品日韩欧美一区二区 | 欧美日韩精品一区二区三区蜜桃 | 欧美日一区 | 伊人伊人伊人 | 久久久日韩精品一区二区三区 | 自拍 亚洲 欧美 老师 丝袜 | 中文字幕在线免费观看 | 国产做a爱免费视频 | 日韩国产在线观看 | 欧美一区二区三区视频在线观看 | 欧美中文字幕一区二区三区亚洲 | 精品国产一区二区三区观看不卡 | 九九看片 | 91精品国产综合久久婷婷香蕉 | 午夜噜噜噜 | 欧美精品片 | 国产农村妇女毛片精品久久麻豆 | 国产91久久精品一区二区 | 91亚洲国产成人久久精品网站 | 国产成人精品久久二区二区 | 永久免费在线观看 | 亚洲第一天堂 | 国产91在线精品 | 欧美精品久久久久 | 亚洲成人免费视频在线 | 91视频a| 亚洲精品99 | 狠狠操av| 草草视频在线观看 | 久久久久久影院 | 国产日韩精品一区 | 成人看片在线观看 | 丁香六月激情 | 日韩精品四区 | 久久狠狠| 日韩中文字幕久久 | 欧美黑人狂野猛交老妇 | 午夜视频大全 | 日日日干干干 |