2011-10-12 68 views
0

我有一個擁有數百萬條記錄的文件。我將在這裏簡單介紹兩個樣本記錄。我的目標是添加分隔符(如逗號)以使文件具有相同數量的分隔符,因此我可以將文件上載到數據庫。shell腳本:嵌套while循環:不拾取外部循環計數器

問題是,嵌套的while循環只是在行尾添加了固定數量的分隔符。我的目標是根據文件已有的分隔符數量動態添加分隔符。我將inner while循環更改爲if語句塊,同樣的行爲也發生了。所以我不認爲嵌套的while循環是必要的。

這裏是我的示例文本文件:

1st,1, 
2nd,2 

這裏是腳本。第一個用戶輸入位置是文本文件,第二個位置是我想要的分隔符的數量。

#!/bin/bash 

f="$1" 
delim="$2" 

while read line 
do 
cnt=`echo $line | tr -cd ',' | wc -c` 
    while [[ $cnt -lt $delim ]]; 
    do 
      sed -i 's/$/,/' $f 
     cnt=`expr $cnt + 1` 
    done 
done < $f 

下面是使用bash -x我的跟蹤:

bash -x csv.sh split_address_2.csv 3 
+ f=split_address_2.csv 
+ delim=3 
+ read line 
++ wc -c 
++ tr -cd , 
++ echo 1st,1, 
+ cnt=2 
+ [[ 2 -lt 3 ]] 
+ sed -i 's/$/,/' split_address_2.csv 
++ expr 2 + 1 
+ cnt=3 
+ [[ 3 -lt 3 ]] 
+ read line 
++ wc -c 
++ tr -cd , 
++ echo 2nd,2 
+ cnt=1 
+ [[ 1 -lt 3 ]] 
+ sed -i 's/$/,/' split_address_2.csv 
++ expr 1 + 1 
+ cnt=2 
+ [[ 2 -lt 3 ]] 
+ sed -i 's/$/,/' split_address_2.csv 
++ expr 2 + 1 
+ cnt=3 
+ [[ 3 -lt 3 ]] 
+ read line 

這裏是文本文件的輸出。您可以看到腳本在每行的末尾添加了3個逗號。

1st,1,,,, 
2nd,2,,, 

非常感謝您的迴應。祝你有美好的一天!

回答

2

爲什麼在這裏使用sed -i?通過該命令,您正在搜索並替換您的整個文件,在每行上...

在輸入文件的第一行中,已經有2個逗號,所以您的while循環運行一次,在輸入文件中用逗號附加每行。在第二行中,只有一個逗號,所以您的while循環會運行兩次,並在您的整個文本的每行後面附加2個逗號。這就是爲什麼當你運行你的腳本時,每行之後有3個額外的逗號。

我對腳本做了一些簡單的小調整。它可以像你預計的那樣工作:

#!/bin/bash 

f="$1" 
delim="$2" 

while read line 
do 
cnt=`echo $line | tr -cd ',' | wc -c` 
    while [[ $cnt -lt $delim ]]; 
    do 
     line=`echo $line | sed 's/$/,/'` 
     cnt=`expr $cnt + 1` 
    done 
    echo $line 
done < $f 
+0

非常不錯的改進。它像一個魅力一樣工作!從sed -i改爲你的line ='echo $ line | sed's/$ /,/''可能會提高很多速度。我將不得不測量速度差異的樂趣。謝謝福克斯先生! – dave

+0

那麼,如果你真的關心「運行時速度」,你可以試試這個:line =「line $,」。使用sed非常慢。我堅持sed只是因爲你之前使用過,我想表明sed也可以。 –