Сценарий оболочки: вложенный цикл while: не обрабатывает счетчик внешнего цикла - PullRequest
0 голосов
/ 13 октября 2011

У меня есть файл с миллионами записей. Я просто сделаю это просто с двумя примерами записей здесь. Моя цель - добавить разделители, например запятую, чтобы файл имел такое же количество разделителей, чтобы я мог загрузить файл в базу данных.

Проблема в том, что вложенный цикл 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 Ответ

2 голосов
/ 13 октября 2011

Почему вы использовали sed -i здесь?С помощью этой команды вы выполняете поиск и замену всего файла там, в каждой строке ...

В первой строке входного файла уже есть 2 запятых, поэтому цикл while выполняетсядобавив каждую строку во входном файле с лишней запятой.Во второй строке есть только одна запятая, поэтому ваш цикл while выполняется дважды, добавляя каждую строку в весь ваш текст с двумя дополнительными запятыми.Вот почему по 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...