2015-05-28 2 views
0

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

#!/bin/bash 
for file in *.csv ; 
    do 

     echo $file #check 
     OLDIFS=$IFS 
     IFS="," 

     while read var1 
     do 
       echo $var1   
     done < $file 
     IFS=$OLDIFS 
done 

CSV-файлы следуют все в том же формате, 1 линия и 12 переменные, такие как:

name,1,2,3,4,5,6,7,8,9,11 

Мне кажется, что условия while всегда ложные и никогда не запускаются. Не могли бы вы сказать, где я ошибаюсь? Thanks

+0

Похоже, что это должно сработать. Какую оболочку вы используете? Как вы его запускаете? Где вы его запускаете и где находятся csvs, находятся ли они в одном каталоге? Вы вообще получаете какой-либо вывод? – 123

+0

Двойная цитата ваших переменных: 'done <" $ file "' – choroba

+0

Каков результат запуска этого скрипта? Вы видите, что он выводит любые имена файлов? –

ответ

3

Чтобы получить только первое поле, вам необходимо предоставить два аргумента до read; первое для первого поля, второе - для сохранения оставшихся значений после раскола.

#!/bin/bash 
for file in *.csv; do 
    echo $file #check 
    while IFS=, read name rest; do 
     echo "$name"   
    done < "$file" 
done 
0

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

#!/bin/bash 
for file in *.csv 
do 
    echo "$file" #check 

    IFS=',' read -a vars < "$file" 

    for var1 in ${vars[@]} 
    do 
     echo "$var1" 
    done 
done 
Смежные вопросы