0

field5 以上の単語で 1 の位置 (コロンの後の 1 のみを考慮) を表すにはどうすればよいですか? 右から左に数えます。

入力:

TT-124 06-03-14 08-02-10 FAS   CAT1:10
TT-125-1 05-03-14 10-06-08 CAS   CAT2:1010 FAT1:10000
TT-125-3 07-03-14 11-02-06 FAS   FAT1:1101
SS-120-1 05-03-14 09-04-07 FAS   CAT3:100000
AA-121-0 06-03-14 08-03-06 CAS   FAT2:11 CAT1:101100

出力:

TT-124 06-03-14 08-02-10 FAS   CAT1:1
TT-125-1 05-03-14 10-06-08 CAS   CAT2:3 CAT2:1 FAT1:4
TT-125-3 07-03-14 11-02-06 FAS   FAT1:0 FAT1:2 FAT1:3
SS-120-1 05-03-14 09-04-07 FAS   CAT3:5
AA-121-0 06-03-14 08-03-06 CAS   FAT2:0 FAT2:1 CAT1:2 CAT1:3 CAT1:5

cygwin で動作する以下のスクリプト (誰かの提案による) を試しましたが、nawk または /usr/xpg4/bin/awk を使用して Solaris 10 では動作しません。solaris で実装するにはどうすればよいですか?

awk '{for(i = 5; i <= NF; i++) {split($i, a, ":"); $i = ""; split(a[2], b, "");
  for(j = 1; j <= length(b); j++) {if(b[j] == 1)
    {$i = ($i == "") ? (a[1] ":" length(b) - j) : ($i FS a[1] ":" length(b) - j)}}};
  print $0}' file
4

3 に答える 3

1

このスニペットを試してください。

#!/usr/bin/perl

use strict;
use warnings;

foreach my $line (<DATA>) {
  my @args = split /\s+/, $line;

  foreach my $arg (@args) {
    if (not $arg =~ /([A-Z]+\d+)\:([0-1]+)/) {
      print "$arg ";
      next;
    }

    my @bits = split //, $2;
    my $j = $#bits;
    for my $i (0 .. $#bits) {
      print "$1:$j " if $bits[$i];
      $j--;
    }

  }
  print "\n";
}

__DATA__
TT-124 06-03-14 08-02-10 FAS   CAT1:10
TT-125-1 05-03-14 10-06-08 CAS   CAT2:1010 FAT1:10000
TT-125-3 07-03-14 11-02-06 FAS   FAT1:1101
SS-120-1 05-03-14 09-04-07 FAS   CAT3:100000
AA-121-0 06-03-14 08-03-06 CAS   FAT2:11 CAT1:101100

出力:

TT-124 06-03-14 08-02-10 FAS CAT1:1 
TT-125-1 05-03-14 10-06-08 CAS CAT2:3 CAT2:1 FAT1:4 
TT-125-3 07-03-14 11-02-06 FAS FAT1:3 FAT1:2 FAT1:0 
SS-120-1 05-03-14 09-04-07 FAS CAT3:5 
AA-121-0 06-03-14 08-03-06 CAS FAT2:1 FAT2:0 CAT1:5 CAT1:3 CAT1:2 
于 2014-03-19T11:33:03.360 に答える
1

入力データが必要な出力と一致していません。2 行目が欲しいと言っていますCAT2:3 CAT2:1が、それは右から左の順序ではなく、出力の他の行と一致しないので、それは間違いだと思います。

このプログラムは必要なものだと思います。コマンドラインのパラメーターとして入力ファイルへのパスが必要であり、出力が STDOUT に出力されます。

use strict;
use warnings;

while (<>) {

  my @fields = split;

  for (my $i = $#fields; $i >= 4; --$i) {
    my ($prefix, $suffix) = split /:/, $fields[$i];
    my @positions;
    push @positions, length($suffix) - $-[0] - 1 while $suffix =~ /1/g;
    my @expansions = map "$prefix:$_", reverse @positions;
    splice @fields, $i, 1, @expansions;
  }

  print "@fields\n";
}

出力

TT-124 06-03-14 08-02-10 FAS CAT1:1
TT-125-1 05-03-14 10-06-08 CAS CAT2:1 CAT2:3 FAT1:4
TT-125-3 07-03-14 11-02-06 FAS FAT1:0 FAT1:2 FAT1:3
SS-120-1 05-03-14 09-04-07 FAS CAT3:5
AA-121-0 06-03-14 08-03-06 CAS FAT2:0 FAT2:1 CAT1:2 CAT1:3 CAT1:5
于 2014-03-19T11:33:23.667 に答える