[英]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
我遇到了兩個問題:
例如,如果someFile
包含:
John,1,green
Bob,2,blue
注釋的echo
語句只會顯示2
"$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.