提取、排序并将多个文件的数据保存为一个文件

提取、排序并将多个文件的数据保存为一个文件

我有多个.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(零) 代替。

我已经尝试过sedawk但无法完成我想要的。下一步是将大文件导入 excel。

答案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

相关内容