#bash #csv
#bash #csv
Вопрос:
Я относительно новичок в bash / программировании в целом.
У меня есть CSV с одним столбцом, который выглядит следующим образом:
domain1.com
domain2.com
domain3.com
domain4.com
Я хочу просмотреть каждую запись и что-то с ней сделать. Вот мой код:
foo(){
i=0
while read -a line;
do
echo ${line[i]}
((i ))
done < myfile.csv
}
И ничего не происходит. Я понял, что если я изменю файл, на который я указываю, на:
done< <(grep '' myfile.csv)
это будет работать, но только выплюнет самую последнюю строку CSV, например:
domain4.com
Опять же, я новичок и сам учусь этому, поэтому буду признателен за любые объяснения, которые вы хотите дать в своих ответах!
РЕДАКТИРОВАТЬ Итак, похоже, что моя новая проблема заключается в удалении символа ^M из моего CSV-файла. Как только я выясню, как это сделать, я отмечу здесь ответ, который подходит мне.
Комментарии:
1. Если есть только один столбец, тогда
while read -r line; do echo "$line"; done < file.csv
тоже будет работать.2. тот же результат: ничего…
3. Можете ли вы показать вывод
head file.csv | cat -vte
4. Я понимаю, что вы просите совета по Bash, но другие инструменты Linux могут лучше подойти для работы с текстовыми файлами построчно. Я бы предложил попробовать
awk
5.Попробуйте,
echo >> file.csv
прежде чем запускать предложенныйwhile
мной цикл.
Ответ №1:
Если вы хотите сохранить свои строки в массиве, вы бы просто сделали:
readarray -t lines < file
И, если вы хотите попробовать обработать эти строки, у вас может быть что-то вроде
for line in "${lines[@]}"; do
echo "$line"
done
Или по индексу (разум !
):
for i in "${!lines[@]}"; do
echo "${lines[i]}"
done
Индексы начинаются с 0.
Ответ №2:
while read p; do
echo $p
done < myfile.csv
Комментарии:
1. Этот пример отвечает на вопрос для ограниченного набора данных, показанного в примере, но завершится ошибкой, если в тексте есть пробелы. Возможно, вы захотите добавить к нему префикс
IFS=$'n'
2. @KirkRoybal Хотя вы правы, нужно добавить, что в примере показаны доменные имена, а доменные имена не могут содержать пробелов.
Ответ №3:
Похоже, у вас есть 2 проблемы:
- Все ваши строки заканчиваются
r
- Нет новой строки или
r
в конце последней строки
Чтобы устранить эту проблему, используйте этот скрипт:
echo >> file.csv
while read -r line; do echo "$line"; done < <(tr 'r' 'n' < file.csv)
Ответ №4:
Вы также можете просто прочитать файл в массив с помощью:
array=( `<file` )
Если вам нужно использовать числовые индексы, то вы можете получить доступ к элементам с помощью:
for ((i=0;i<${#array[@]};i ))
printf " array [-]: %sn" "$i" "${array[$i]}"
done