0

这是我文件中的示例行:

42001232  2011-07-01  51  100001  0  100002  0  2011-07-02  51  100003  0  100004  0

我如何安排它看起来像这样

42001232  2011-07-01  51  100001  0
42001232  2011-07-01  51  100002  0
42001232  2011-07-02  51  100003  0
42001232  2011-07-02  51  100004  0

除了第一列之外,所有列都以日期开头重复。我需要以表格形式组织它。另外,这里的分隔符是TAB。

4

2 回答 2

1

这是使用awk. 像这样运行:

awk -f script.awk file

内容script.awk

BEGIN {
    FS=OFS="\t"
}
{
    for(i=2;i<=NF;i++) {
        if ($i ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/) {
            for (j=i+2;j<=NF;j+=2) {
                if ($j ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/) {
                    break
                }
                else {
                    print $1, $i, $(i+1), $j, $(j+1)
                }
            }
        }
    }
}

结果:

42001232    2011-07-01  51  100001  0
42001232    2011-07-01  51  100002  0
42001232    2011-07-02  51  100003  0
42001232    2011-07-02  51  100004  0

或者,这是单线:

awk 'BEGIN { FS=OFS="\t" } { for(i=2;i<=NF;i++) if ($i ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/) for (j=i+2;j<=NF;j+=2) if ($j ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/) break; else print $1, $i, $(i+1), $j, $(j+1) }' file
于 2013-01-27T08:16:58.007 回答
0

这适用于给定的数据:

#!/usr/bin/env perl
use strict;
use warnings;
use English qw( -no_match_vars );

$OFS = qq"\t";

while (<>)
{
    chomp;
    my(@fields) = split /\s+/, $_;
    my $col1 = shift @fields;
    my $date = shift @fields;
    my $col3 = shift @fields;
    while (scalar(@fields) > 1)
    {
        if ($fields[0] =~ /^\d{4}-\d\d-\d\d$/)
        {
            $date = shift @fields;
            $col3 = shift @fields;
            next;
        }
        else
        {
            my $col4 = shift @fields;
            my $col5 = shift @fields;
            print $col1, $date, $col3, $col4, "$col5\n";
        }
    }
    print STDERR "oops - debris $fields[0] left over\n" if (scalar(@fields) != 0);
}

我得到的输出是:

42001232        2011-07-01      51      100001  0
42001232        2011-07-01      51      100002  0
42001232        2011-07-02      51      100003  0
42001232        2011-07-02      51      100004  0

这是一个必须解析的非常可怕的格式。例如,我不得不对处理重复的方式做出一些假设,以便日期之后的列固定到下一个日期。

于 2013-01-27T06:59:39.503 回答