向空的列添加 null

mon*_*onk 0 perl awk

我正在尝试使用perlor将空的列设置为空awk,以查找列数,可以使用标题的列数。我尝试使用perl和一些正则表达式来执行解决方案。但是,输出看起来非常接近所需的输出,但如果仔细观察,第一行会显示不正确的数据。

输入数据:

id      name           type          foo-id  zoo-id  loo-id-1  moo-id-2
-----  ---------------  -----------  ------  ------  ------  ------
0      zoo123        soozoo          8               31        32
51     zoo213        soozoo          48      51
52     asz123        soozoo          47      52
53     asw122        soozoo          1003    53
54     fff123        soozoo          68      54
55     sss123        soozoo          75      55
56     ssd123        soozoo          76      56
Run Code Online (Sandbox Code Playgroud)

预期输出:

0      zoo123        soozoo          8       null      31        32
51     zoo213        soozoo          48      51        null      null
52     asz123        soozoo          47      52        null      null
53     asw122        soozoo          1003    53        null      null
54     fff123        soozoo          68      54        null      null
55     sss123        soozoo          75      55        null      null
56     ssd123        soozoo          76      56        null      null
Run Code Online (Sandbox Code Playgroud)

非常接近解决方案,但第 1 行显示的数据不正确:

echo "$x"|grep -E '^[0-9]+'  |perl -ne 'm/^([\d]+)(?:\s+([\w]+))?(?:\s+([-\w]+))?(?:\s+([\d]+))?(?:\s+([\d]+))?(?:\s+([\d]+))?(?:\s+([\d]+))?/;printf "%s %s %s %s %s %s %s\n", $1, $2//"null", $3//"null",$4//"null",$5//"null",$6//"null",$7//"null"' |column -t
0   zoo123  soozoo  8     31  32    null
51  zoo213  soozoo  48    51  null  null
52  asz123  soozoo  47    52  null  null
53  asw122  soozoo  1003  53  null  null
54  fff123  soozoo  68    54  null  null
55  sss123  soozoo  75    55  null  null
56  ssd123  soozoo  76    56  null  null
Run Code Online (Sandbox Code Playgroud)

Dav*_*oss 5

当您要解析固定宽度的字符串时,您会发现它unpack()比正则表达式更好。

这应该演示如何做到这一点。我会让你把它转换成单行的。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

while (<DATA>) {
  next if /^\D/; # Skip lines that don't start with a digit

  # I worked out the unpack() template by counting columns.
  my @data = map { /\S/ ? $_ : 'null' } unpack('A7A14A16A8A8A8A8');

  say join ' ', @data;
}

__DATA__
id      name           type          foo-id  zoo-id  loo-id-1  moo-id-2
-----  ---------------  -----------  ------  ------  ------  ------
0      zoo123        soozoo          8               31        32
51     zoo213        soozoo          48      51
52     asz123        soozoo          47      52
53     asw122        soozoo          1003    53
54     fff123        soozoo          68      54
55     sss123        soozoo          75      55
56     ssd123        soozoo          76      56
Run Code Online (Sandbox Code Playgroud)

输出:

$ perl unpack | column -t
0   zoo123  soozoo  8     null  31    32
51  zoo213  soozoo  48    51    null  null
52  asz123  soozoo  47    52    null  null
53  asw122  soozoo  1003  53    null  null
54  fff123  soozoo  68    54    null  null
55  sss123  soozoo  75    55    null  null
56  ssd123  soozoo  76    56    null  null
Run Code Online (Sandbox Code Playgroud)