Extraia, ordene e salve dados de vários arquivos em um

0

Eu tenho vários arquivos .sie ,

The SIE format is an open standard for transferring accounting data between different software produced by different software suppliers. of which I want to extract some information and create one big ordered file that is sorted by date. I am trying to add a tab between the columns.

Aqui está um exemplo do conteúdo dos arquivos:

#FLAGGA 0
#PROGRAM "ISUPOS Kassa 3" 3.1.129
#FORMAT PC8
#GEN 20180119
#SIETYP 4
#FNAMN "Café"
#VER "" "1" 20180113 "Z-Dagrapport #1, Kassa #1 2018-01-13"
{
   #TRANS 1910 {} 819.00
   #TRANS 1920 {} 1334.00
   #TRANS 1930 {} 438.00
   #TRANS 2620 {} -277.61
   #TRANS 3052 {} -2313.39
}

Isso é de um arquivo. Alguns arquivos podem ou não ter todas as #TRANS linhas nele.

Gostaria que o "arquivo grande" tivesse uma linha para cada arquivo, por exemplo,

2018-01-13    819     1334.00    438.00    -277.61    -2313.39

se um dos registros #TRANS estiver ausente, deverá haver um 0 (zero) em seu lugar.

Eu tentei com sed e awk , mas não consigo realizar o que quero. O próximo passo é importar o arquivo grande para o Excel.

    
por zaonline 09.05.2018 / 22:50

1 resposta

1

Este programa awk simples irá procurar no arquivo de entrada números #TRANS específicos e colocá-los na tabela. Se um ou mais #TRANS estiver ausente, então será zero.

awk '
BEGIN{ for(i=1;i<=6;i++){ o[i]=0 } }
/#VER/ { date=$4; o[1]=substr(date,0,4)"-"substr(date,5,2)"-"substr(date,7,2); }
/#TRANS 1910/{ o[2]=$4 }
/#TRANS 1920/{ o[3]=$4 }
/#TRANS 1930/{ o[4]=$4 } 
/#TRANS 2620/{ o[5]=$4 }
/#TRANS 3052/{ o[6]=$4 }
END{ for(i=1;i<=6;i++){ out=out o[i] " "; } print out }
' file

Para muitos arquivos, você pode usar esse código:

echo "DATE TRANS1910 TRANS1920 TRANS1930 TRANS2620 TRANS3052" >result.txt
for file in $(ls -1 *.sie); do  
    awk '
      BEGIN{ for(i=1;i<=6;i++){ o[i]=0 } }
      /#VER/ { date=$4; o[1]=substr(date,0,4)"-"substr(date,5,2)"-"substr(date,7,2); }
      /#TRANS 1910/{ o[2]=$4 }
      /#TRANS 1920/{ o[3]=$4 }
      /#TRANS 1930/{ o[4]=$4 } 
      /#TRANS 2620/{ o[5]=$4 }
      /#TRANS 3052/{ o[6]=$4 }
      END{ for(i=1;i<=6;i++){ out=out o[i] " "; } print out }
    ' ${file} >> result.txt
done

O resultado será:

cat result.txt 
DATE TRANS1910 TRANS1920 TRANS1930 TRANS2620 TRANS3052
2018-01-13 819.00 1334.00 438.00 -277.61 -2313.39
    
por 17.05.2018 / 13:04

Tags