簡體   English   中英

從while循環讀取文件沒有得到第一行

[英]Reading file from while loop not getting first line

以下嘗試從文件中讀取,獲取 CSV 的第二個字段,並在字段值大於為命令指定的第一個參數時執行操作:

while  read -r line
do
       var="$(cut -f2 -d,)" 
       #echo "$var"
       if [ "$var" -gt "$1" ]; then
         # do stuff
       fi

done < someFile

我遇到了兩個問題:

  1. 循環不處理第一行。 我是否缺少有關輸入重定向如何工作的一些基本知識? 或者它如何與 while 循環一起工作?

例如,如果someFile包含:

John,1,green
Bob,2,blue

注釋的echo語句只會顯示2

  1. 測試"$var" -gt "$1"產生錯誤integer expression expected

$1始終是一個數值。 我已經嘗試使用printf$var轉換$var整數,但我一直在閱讀沒有必要轉換為整數,因為-gt會進行隱式類型轉換。

謝謝

cut正在竊取您的數據。

$: cat in
x,1,x
x,2,x
x,3,x

$: while read line; do echo "[$line]"; cut -f 2 -d,  ; done < in
[x,1,x]
2
3

read是將我的文件的第一行讀入$line ,我在方括號中回顯,以便您可以看到它。 然后cut正在處理文件的其余部分,因為兩者都將其視為整個循環的標准輸入。

您需要的是明確處理您已經閱讀的數據。

$: time while read line; do echo "[$line]"; val=$(cut -f 2 -d,<<<"$line"); echo "<$val>"; done < in
[x,1,x]
<1>
[x,2,x]
<2>
[x,3,x]
<3>

real    0m0.552s
user    0m0.106s
sys     0m0.401s

您可以通過跳過cut子進程並使用內置的bash參數解析來使其更快/更有效。

$: time while read line; do echo "[$line]"; val="${line#*,}"; val="${val%%,*}"; echo "<$val>"; done < in
[x,1,x]
<1>
[x,2,x]
<2>
[x,3,x]
<3>

real    0m0.001s
user    0m0.000s
sys     0m0.000s

如果您沒有明確的理由需要整行且分隔符仍在其中,那么您只需要read

$: time while IFS=, read v1 v2 v3; do echo "v1=$v1 v2=$v2 v3=$v3"; done < in
v1=x v2=1 v3=x
v1=x v2=2 v3=x
v1=x v2=3 v3=x

real    0m0.001s
user    0m0.000s
sys     0m0.000s

您閱讀了變量line但不使用它:

var="$(cut -f2 -d,)" 

不應該是這樣的:

var="$(cut -f2 -d, $line)" 

或類似的東西?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM