从复杂的文件结构中提取数据

Modified on: Sat, 30 Jun 2018 09:36:00 +0800

我有一个txt文件,它是来自数据库的转储,每行包含一个条目。结构是这样的:

1500 29/03/2010 18 02 09 47 17 45 28.248 0 0.01 130 12.721 7908 298,809 YES 3.046.550,39 6.500.000,00 17,444,222 1501 30/03/2010 27 54 28 50 22 03 37.223 0 0.00 97 22,466 7379 421.90 NO 20,262,429 25,000,000.01 17,995,281.33 ... the third record starts here

该数据库包含21个字段。前面的行显示了该数据库的两个记录的转储。空白行代表数据库中的空白字段。

第一个字段(F0)是您看到的数字1500,1501 ......

第二个字段(F1)是日,月,年格式的日期。

字段F2,F3,F4,F5,F6,F7是六个整数。

我需要从这个文件中提取F0,F2,F3,F4,F5,F6,F7,为每个文件创建一行。

鉴于上面的两个记录,最终文件将是

1500,18,02,09,47,17,45 1501,27,54,28,50,22,03

我知道如何使用一个长达数英里的bash脚本并在每一行上进行交互等等。但我也知道unix是一个技巧包,特别是sed命令和这可能可以通过一条简单的线来完成。我喜欢学习新东西,所以我问你们这些人是Unix中的神,我该怎么做。

我在OSX Mavericks上。谢谢。

作者:terdon,SpaceDog

最佳答案

这是一种方式:

$ perl -000ne '@f=split(/\n/); print join(",",@f[0,2..7]) , "\n"' file.txt  
1500,18,02,09,47,17,45
1501,27,54,28,50,22,03

说明:

  • -000:激活“段落模式”,它将perl的字段分隔符设置为\n\n,连续换行。这意味着它会将您的每条记录视为一行。

  • @f=split(/\n/);:将当前行(记录)拆分为换行符并保存为数组@f。此数组现在包含记录中的每个字段。这意味着数组切片@f[0,2..8]将包含字段0和2到8。

  • print join ",",@f[0,2..8] , "\n"':这将使用逗号连接数组切片,并打印生成的字符串然后换行。

作者:,terdon

相关问答

添加新评论