Я пытаюсь создать сценарий, который построчно перемещается в файл, извлекает последнее слово в каждом предложении и выполняет другой созданный мной сценарий (который работает, называется промежуточным) и печатает все это отдельными строками.
У меня почему-то зацикливается бесконечный цикл.
function find_id {
next_file="${*:2}"
temp_file="`echo $next_file | cut -d"." -f1`"
if [[ $temp_file != station ]]; then
while read line; do
if [[ -f "${temp_file}.station" ]]; then
train_col=$((${#line[*]}-1))
$train_id=`echo ${line[${train_col}]}`
echo -n "`intermediate $train_id`"
fi
done < ${temp_file}.station
next_file="`echo $next_file | cut -d"." -f2- | cut -d" " -f2-`"
temp_file="`echo $next_file | cut -d"." -f1`"
echo "`find_id $1 $next_file`"
fi
}
file_list= `ls *.station``
echo "`find_id $1 $file_list``" | sort -n | cut -d" " -f2- | uniq
Мне не разрешено использовать awk или sed.
С деятельностью, которую вы делаете, как объяснено в вашем вопросе, кажется, вам нужен только awk
для всех этих вещей.
awk '$NF' infile*.txt > outfile.txt
$NF
относится к последнему слову (означает слово с пробелами вокруг )в каждой строке в awk
.
Пока существует приведенное выше awk
решение, вы можете использовать чтение строк в массив и печать последнего элемента этого массива с отрицательным индексом (bash 4.3 и выше ).
arrayedline=( $line )
printf "%s\n", "${arrayedline[@]-1}"
В более старой версии bash
вы можете использовать выражение в индексе arrayedline[${#arrayedline[@]-1}]
, которое с подстрокой один из длины массива ${#arrayedline[@]}
мы можем получить последний элемент этого.
arrayedline=( $line )
printf "%s\n", "${arrayedline[${#arrayedline[@]}-1]}"
Или вы даже можете использовать следующее:
printf "%s\n", "${arrayedline[@]:(-1)}" #or
printf "%s\n", "${arrayedlne[@]: -1}"
Теперь, когда в bash
индекс массива начинается с 0
.
Вот как вы можете это сделать с дополнительным требованием, что вы не можете использовать ни sed
, ни:
for i in `split -n 1 fn* --filter='cat | rev | cut -f 1 -d 'f' | rev'`; do./yourscript.sh $i; done
Объяснение того, почему это работает:
split
разбивает файлы, имя которых начинается с fn
, на строки и обрабатывает cat | rev | cut -f 1 -d ' ' | rev
в каждой строке.
cat
повторяет эту строку, rev
переворачивает ее, cut
разделяет ее на слова, разделенные ' '
и выводит первое слово перевернутой строки, rev
переворачивает ее обратно; вы получаете последнее слово вашей линии.
Затем for...do...done
выполняет ваш сценарий для этого слова.