Shell script para buscar parte do nome do arquivo a partir do arquivo de entrada e transformá-lo em um arquivo de saída

2

Source_FIle:

/path/to file/A_B_C_D_201507290915.csv

Destination_File deve ser como:

/some/other/path/to file/A_B_C_D_201507290915.csv

Eu preciso transformar Source_FIle e armazenar com o mesmo nome em algum outro local.

Transformação é como converter todas as linhas de csv na coluna. CÓDIGO utilizado:

#!/bin/bash
var='echo A_B_C_D_*.csv | grep -oP '(?<=_)\d+(?=\.)''
awk -F, '{for(i=1;i<=NF;i++){A[NR,i]=$i};if(NF>n){n=NF}}
END{for(i=1;i<=n;i++){
for(j=1;j<=NR;j++){
s=s?s","A[j,i]:A[j,i]}
print s;s=""}}' A_B_C_D_*.csv > /some/other/path/to file/A_B_C_D_$var.csv

Ele está funcionando bem para um arquivo, mas no caso de vários arquivos de origem, ele fornece um erro de redirecionamento ambíguo.

    
por hdk0310 04.08.2015 / 12:12

3 respostas

2

O problema está na sua variável var . Se você quiser manter, prefira atribuí-lo a um array.

Código:

#!/bin/bash
var='echo A_B_C_D_*.csv | grep -oP '(?<=_)\d+(?=\.)''
arr=($var)
for i in "${arr[@]}"
do

    awk -F, '{for(i=1;i<=NF;i++){A[NR,i]=$i};if(NF>n){n=NF}}
    END{for(i=1;i<=n;i++){
    for(j=1;j<=NR;j++){
    s=s?s","A[j,i]:A[j,i]}
    print s;s=""}}' A_B_C_D_$i.csv > /some/path_to/dest/A_B_C_D_$i.csv

done
    
por 04.08.2015 / 12:45
1

Você pode usar a variável filename em awk

Não tenho certeza do que você está definindo var, então deixarei isso de fora

awk -F, '{
          for(i=1;i<=NF;i++)A[NR,i]=$i
          if(NF>n)n=NF
         }
         ENDFILE{
              sub(/.*\//,"",FILENAME)
              for(i=1;i<=n;i++){
                  for(j=1;j<=NR;j++){
                      s=s?s","A[j,i]:A[j,i]
                  }
                  print s > "NEWPATH" FILENAME;s="" 
              }
         }' A_B_C_D_*.csv
    
por 04.08.2015 / 12:41
0

Use basename , parte de coreutils .

Usando bash :

for i in $(<file_with_source_file_names) 
 do  
    mv $i /some/other/path/to\ file/$(basename $i) 
 done

Ou você pode usar cp em vez de mv . Sua escolha.

    
por 04.08.2015 / 13:55