<menu id="u2y6m"></menu>
<tt id="u2y6m"><rt id="u2y6m"></rt></tt>
  • <input id="u2y6m"></input><tt id="u2y6m"><blockquote id="u2y6m"></blockquote></tt>
    <bdo id="u2y6m"><small id="u2y6m"></small></bdo>
  • <blockquote id="u2y6m"><optgroup id="u2y6m"></optgroup></blockquote>
  • 溫馨提示×

    Shell逐行處理文本求和的示例分析

    發布時間:2021-06-12 09:22:42 來源:億速云 閱讀:125 作者:小新 欄目:web開發

    這篇文章主要介紹Shell逐行處理文本求和的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

    假設要要計算文本test.data的第二列的數字之和:

    1 12  2 23  3 34  4 56

    當然你可能會這樣處理:

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

    很快就得到了結果。不過,本文要說的點與awk無關。我們通過另外一種方式來計算,即逐行分析處理的方式。

    嘗試一

    我們嘗試第一種方式,shell實現如下:

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

    輸出結果:

    we get sum:0

    這是為什么!為什么得到的結果會是0呢?

    這事壞就壞在腳本中的|,眾所周知,這是一個管道命令,而這也就意味著,while循環的執行結果都是在一個subshell中,一旦這個subsell退出了,它里面的結果也就沒有了。

    其實這個問題利用有了這個神器,再也不怕shell寫得不對了中提到的工具很容易發現:

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

    嘗試二

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

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

    輸出結果:

    get line :1 get line :12 get line :2 get line :23 get line :3 get line :34 get line :4 get line :56 we get sum:135

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

    我們預期的應該是遇到換行才停止讀取,為了達到這個目的,我們可以設置這個標記,即通過設置IFS來達到目的。在上面的shell開頭加上:

    IFS=$'\n'

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

    嘗試三

    讓我們再換一種方式:

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

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

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

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

    其中col1,col2就分別代表了第一列,第二列,使用的時候,可以直接使用對應列的內容。

    但是,如果我們要讀取的內容包括了轉義字符會怎么辦?例如:

    \n 12 \n 23 \n 34 \n 56

    執行結果:

    line   12 line   23 line   34 line   56 we get sum:125

    從結果可以看到,雖然內容能否讀取到,但是內容被打印出來的時候,已經變了,\被當成轉義字符處理了,如果不想讓它轉義處理怎么辦?只需要加上-r參數即可:

    while read -r line

    總結

    在逐行處理文本過程中,主要關注以下幾種情況:

    • 行中有空格,tab

    • 行中有轉義字符

    另外,通過shellcheck工具也會發現,它并不推薦for in file這種方式逐行處理文本:

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

    以上是“Shell逐行處理文本求和的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    免費撥打  400 100 2938 免費撥打 400 100 2938
    24小時售后技術支持 24小時售后技術支持
    返回頂部 返回頂部
    <menu id="u2y6m"></menu>
    <tt id="u2y6m"><rt id="u2y6m"></rt></tt>
  • <input id="u2y6m"></input><tt id="u2y6m"><blockquote id="u2y6m"></blockquote></tt>
    <bdo id="u2y6m"><small id="u2y6m"></small></bdo>
  • <blockquote id="u2y6m"><optgroup id="u2y6m"></optgroup></blockquote>
  • 一本久道久久综合丁香五月_免费视频禁止18以下禁止观看_日本japanese熟睡人妻_成熟闷骚女邻居引诱2