shell脚本:嵌套while循环:不拾取外循环计数器

时间:2011-10-12 22:59:19

标签: shell loops while-loop

我有一个拥有数百万条记录的文件。我将在这里简单介绍两个样本记录。我的目标是添加分隔符,例如逗号,以使文件具有相同数量的分隔符,因此我可以将文件上载到数据库。

问题是嵌套的while循环只是在行尾添加了固定数量的分隔符。我的目标是根据文件已有的分隔符数量动态添加分隔符。我将内部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,,,

非常感谢您的回复。祝你有个美好的一天!

1 个答案:

答案 0 :(得分: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