У меня есть несколько файлов .sie ,

Формат SIE является открытым стандартом для передачи учетных данных между различным программным обеспечением, созданным разными поставщиками программного обеспечения. из которых я хочу извлечь некоторую информацию и создать один большой упорядоченный файл, отсортированный по дате. Я пытаюсь добавить вкладку между столбцами.

Вот пример содержимого файлов:

#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
}

Это из одного файла. Некоторые файлы могут содержать или не содержать все строки #TRANS .

Я хотел бы, чтобы "большой файл" имел одну строку для каждого файла, например

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

если одна из записей #TRANS отсутствует, вместо нее должен быть 0 (ноль).

Я пробовал с sed и awk но я не могу добиться того, чего хочу. Следующим шагом является импорт большого файла в Excel.

1 ответ1

1

Эта простая программа awk будет искать во входном файле определенные номера #TRANS и помещать их в таблицу. Если одна или более #TRANS отсутствуют, то в будет ноль.

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

Для многих файлов вы можете использовать такой код:

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

Результатом будет:

cat result.txt 
DATE TRANS1910 TRANS1920 TRANS1930 TRANS2620 TRANS3052
2018-01-13 819.00 1334.00 438.00 -277.61 -2313.39

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .