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

を使用する 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 に答える