Looping através de linhas em vários arquivos (bash)

0

Eu estou tentando criar um script que vai linha por linha em um arquivo, extrai a última palavra em cada frase e executa outro script que criei (que funciona, chamado intermediário) e imprime tudo isso como linhas separadas. / p>

Por algum motivo, recebo um loop infinito.

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

Eu não tenho permissão para usar o awk ou o sed.

    
por evgniy tayarov 22.08.2017 / 21:22

2 respostas

2

Com a atividade que você está fazendo, como explicado na sua pergunta, parece que você precisa apenas de awk para todas essas coisas.

awk '$NF' infile*.txt > outfile.txt

O $NF refere-se à última palavra (significa uma palavra com espaços em branco ao redor) em cada linha em awk .

Embora a solução awk acima esteja lá, você pode usar as linhas para ler uma matriz e imprimir o último elemento dessa matriz com um índice negativo (bash 4.3 e acima).

arrayedline=( $line ) 
printf "%s\n", "${arrayedline[@]-1}"

Na versão mais antiga de bash , você pode usar a expressão no índice arrayedline[${#arrayedline[@]-1}] , que com substring um do comprimento da matriz ${#arrayedline[@]} , podemos obter o último elemento disso.

arrayedline=( $line )
printf "%s\n", "${arrayedline[${#arrayedline[@]}-1]}" 

Ou você pode até usar o seguinte:

printf "%s\n", "${arrayedline[@]:(-1)}"  #or
printf "%s\n", "${arrayedlne[@]: -1}"

Agora que o índice da matriz bash está começando em 0 .

    
por 22.08.2017 / 21:35
0

Veja como você pode fazer isso com o requisito adicional de não poder usar sed :

for i in 'split -n 1 fn* --filter='cat | rev | cut -f 1 -d 'f' | rev''; do ./yourscript.sh $i; done

Explicação de por que funciona:

split divide os arquivos cujo nome de arquivo começa com fn em linhas e processa cat | rev | cut -f 1 -d ' ' | rev em cada linha.

cat ecoa essa linha, rev a inverte, cut a separa em palavras delimitadas por ' ' e gera a primeira palavra da string invertida, rev a inverte; você recebe a última palavra da sua linha.

Em seguida, o for...do...done executa seu script nessa palavra.

    
por 22.08.2017 / 22:12