【问题标题】:Split/duplicate line, like a reverse group_concat拆分/复制行,如反向 group_concat
【发布时间】:2016-07-20 09:31:17
【问题描述】:

我想拆分/复制行(拆分一部分,然后复制其余部分),就像 MySQL 中的反向 group_concat

输入如下(总共超过1M行):

2016-07-18 08:55:09,www.rozklad-pkp.pl,0.575,160x600;120x600,standard
2016-07-18 08:55:09,rozklad-pkp.pl,0.575,320x50;468x60;320x100;750x200;300x75,mobile
2016-07-18 08:55:09,wpolityce.pl,0.87,300x75;300x250;320x100;300x50;320x50,mobile

例如,我想从第二行获取:

2016-07-18 08:55:09,rozklad-pkp.pl,0.575,320x50,mobile
2016-07-18 08:55:09,rozklad-pkp.pl,0.575,468x60,mobile
2016-07-18 08:55:09,rozklad-pkp.pl,0.575,320x100,mobile
2016-07-18 08:55:09,rozklad-pkp.pl,0.575,750x200,mobile
2016-07-18 08:55:09,rozklad-pkp.pl,0.575,300x75,mobile

我不知道如何到达那里,特别是如果我想拆分单行的行数不同。

这个概念对我来说太抽象了,我不知道如何正确“掌握”它。

我考虑过“映射”行,将其拆分为单独的部分(左侧部分,要拆分的部分和右侧部分),grep'ing 分号的数量,将其拆分并复制回来;但这对我来说相当复杂,我认为必须有其他更简单的方法。

我可以使用 grep、sed、awk、Perl 等(通常是 bash)或 SQLite。

【问题讨论】:

  • 对于所有行,其中列出了许多尺寸(用分号分隔)。编辑:所以,示例第 1 行拆分为 2;第 2 行到第 5 行(如图所示),第 3 行到第 5 行等等。
  • 我不想删除任何东西,如果有很多尺寸(实际上是广告横幅的尺寸),只需拆分/复制。有些行将不包含分号,在这种情况下,就像现在一样好。包含分号的行将被拆分为与值一样多的新行(复制左右;并在这些值之间剪切,每行 1 个)。

标签: regex string bash text data-manipulation


【解决方案1】:

你可以试试下面的awk脚本:

awk -F, -v OFS="," '{split($4,a,";"); for(i in a) {$4=a[i];print}}' file

将根据每行第 4 字段的内容复制行。

【讨论】:

  • perl 中相同perl -F, -ane 'for(split/;/,$F[3]){$F[3]=$_;print join(",",@F)}' file
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2013-07-24
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多