Цикл по строкам в нескольких файлах (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.

0
22.08.2017, 22:54
2 ответа

С деятельностью, которую вы делаете, как объяснено в вашем вопросе, кажется, вам нужен только 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.

2
28.01.2020, 02:33

Вот как вы можете это сделать с дополнительным требованием, что вы не можете использовать ни 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выполняет ваш сценарий для этого слова.

0
28.01.2020, 02:33

Теги

Похожие вопросы