Passando lista dinâmica em corte -c

0

Eu tenho um arquivo de largura de banda. Abaixo está a amostra:

0196969696645001200    1100450000000000TEST1 / TECHNOLOTEST               97827Y
0196969696645001500    1100450000000000TEST222 EXPRESS - CMTEST           97827Y
0196969696600701325    7003150000000000TEST33333                          70215U
0196969696621055400    1476210000000000TEST44444SE - CMC AUERSTEST        97803Y

Exemplo de arquivo de metadados:

COL1,1,2
COL2,3,19
COL3,22,27
COL4,28,33
COL5,34,37
COL6,38,40
COL7,78,81

Descrição do problema: Leia o arquivo de metadados (posição inicial e final) para cada coluna e crie um arquivo para cada coluna tomando como referência o arquivo de largura de correção.

Meu código:

feed_file=$1
metadata_file=$2

 if [ $# -lt 2 ]
  then
   echo "Insufficient Number of Parameters passed"
   echo "Usage <FEED FILE NAME> <META DATA FILE NAME>"
   exit 1
 fi

#Read metadata file and create feed file for each attribute 
 while read line
  do
      attrib_name='echo $line | cut -d "," -f1'
      beg_point='echo $line | cut -d "," -f2'
      end_point='echo $line | cut -d "," -f3'
      echo "$attrib_name || $beg_point || $end_point"

      range=$beg_point-$end_point

      cat $feed_file | cut -c $range > $attrib_name
 done < $metadata_file


Error: cut: bad list for c option
    
por Praby 08.12.2017 / 10:03

1 resposta

1

Não use loops de shell para processar texto , use ferramentas de processamento de texto como awk :

awk -F, '
  !meta_done{start[$1] = $2; len[$1] = $3 - $2 + 1; next}
  {for (i in start) print substr($0, start[i], len[i]) > i}
  ' "$meta_file" meta_done=1 "$feed_file"

Observe que há uma limitação em que $meta_file e $feed_file não devem ter o mesmo formato que awk atribuições de variáveis. Se você tiver arquivos chamados meta=data.txt , precisará passar ./meta=data.txt para awk em vez de meta=data.txt .

    
por 08.12.2017 / 13:51

Tags