Ответ 1
Сначала удалите пустые строки с помощью sed
.
for word in `sed '/^$/d' $inputfile`; do
myarray[$index]="$word"
index=$(($index+1))
done
Я повторяю файл по строкам и помещаю каждое слово в массив, и это работает. Но он также берет пустые строки и помещает их как элемент в массив, как я могу пропустить пустые строки?
Пример файла
Line 1
line 2
line 3
line 4
line 5
line 6
Мой код
while read line ; do
myarray[$index]="$line"
index=$(($index+1))
done < $inputfile
Возможный код psuedo
while read line ; do
if (line != space);then
myarray[$index]="$line"
fi
index=$(($index+1))
done < $inputfile
Сначала удалите пустые строки с помощью sed
.
for word in `sed '/^$/d' $inputfile`; do
myarray[$index]="$word"
index=$(($index+1))
done
Будьте более элегантны:
echo "\na\nb\n\nc" | grep -v "^$"
cat $file | grep -v "^$" | next transformations...
Внедрите те же тесты, что и в вашем псевдокоде:
while read line; do
if [ ! -z "$line" ]; then
myarray[$index]="$line"
index=$(($index+1))
fi
done < $inputfile
Тест -z
означает true if empty
. !
отрицает (т.е. true, если не пусто).
Вы также можете использовать выражения, такие как [ "x$line" = x ]
или test "x$line" = x
, чтобы проверить, является ли строка пустой.
Однако любая строка, содержащая пробел , будет считаться пустой. Если это проблема, вы можете использовать sed
для удаления таких строк из ввода (включая пустые строки), прежде чем они будут переданы в цикл while
, как в:
sed '/^[ \t]*$/d' $inputfile | while read line; do
myarray[$index]="$line"
index=$(($index+1))
done
cat -b -s file |grep -v '^$'
Я знаю, что он решил, но мне нужно было выводить нумерованные строки, игнорируя пустые строки, поэтому я подумал о том, чтобы поместить его прямо здесь, если кому-то это понадобится.:)
Используйте grep для удаления пустых строк:
for word in $(cat ${inputfile} | grep -v "^$"); do
myarray[$index]="${word}"
index=$(($index+1))
done
Эта версия очень быстро по сравнению с решениями, которые вызывают внешние команды, такие как sed
и grep
. Также пропускает строки, содержащие только пробелы, строки не должны быть пустыми для пропуска.
#!/bin/bash
myarray=()
while read line
do
if [[ "$line" =~ [^[:space:]] ]]; then
myarray+=("${line}")
fi
done < test.txt
for((i = 0; i < ${#myarray[@]}; ++i))
do
echo ${myarray[$i]}
done