Цитирование через строки в нескольких файлах (bash)

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

По какой-то причине я получаю бесконечный цикл.

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 -f 1 -d ' ' | rev cat | rev | cut -f 1 -d ' ' | rev на каждой строке.

cat перекликается с этой строкой, rev меняет ее, cut ее на слова, разделенные символом ' ' и выводит первое слово перевернутой строки, rev меняет его назад; вы получите последнее слово своей линии.

Затем for...do...done выполняется ваш скрипт на этом слове.