0

入力ファイル

Cat|Dog|Dragon   -40|1000|-20
K|B|L|D|E        -9|1|-100|-8|9

出力ファイル:

Dragon 20
B      1

ワークフローは次のようなものです: 列 2 で最小絶対値のインデックスを見つけ、このインデックスを使用して列 1 の要素をフェッチします。誰かがこれについてアイデアを持っていますか?

4

3 に答える 3

1

私の信じられないほどの知覚力を使用して、これが正確には操作上の問題ではないというヒントを検出しました。でしょうHomeworkか?

{
  split($1, catdog, "|")
  split($2, numbers, "|")
  smallest = -1
  for(i in numbers) {
    a = numbers[i]
    if(a < 0)
      a = -a
    if(smallest == -1 || a < smallest) {
      smallest = a
      j = i
    }
  }
  printf("%-9s %2d\n",  catdog[j], smallest)
}
于 2013-02-26T16:06:21.830 に答える
0
perl -lnwe '($k,$v) = map [split /\|/], split;
             my %a; 
             @a{@$k} = map abs, @$v; 
             print "$_\t$a{$_}" for 
                 (sort { $a{$a} <=> $a{$b} } keys %a)[0];
            ' input.txt

出力:

Dragon  20
B       1

説明:

コマンド ラインは次のように切り替わります。

  • -l便宜上、行末を処理する
  • -n引数ファイル名または標準入力から入力を読み取る

コード:

右端splitは空白で各行を分割します。これらのフィールドをパイプで再度分割し|、結果を配列 ref に入れて、スカラー変数 ( and )[ ... ]内に収まるようにします。次に、新しい入力行ごとにデータを保持する字句ハッシュを宣言します。ある行の値が次の行に漏れるのを避けるために、この宣言が必要です。次に、ハッシュ スライスを介して のキーを の絶対値に割り当てます。これは、次の原則と同じです。$k$v%a$k$v

@foo{'a', 'b', 'c'} = (1, 2, 3);  # %foo = ( a => 1, b => 2, c => 3);

次に、ハッシュを値でソートし、添字付きの最初の値を取得[0]し、対応するキーと値をタブで区切って出力します。

于 2013-02-26T16:09:07.603 に答える
0

次のawkコマンドが機能するはずです。

awk '
function abs(value)
{
  return (value<0?-value:value)
}
{
   len=split($2,arr,"|")
   min=abs(arr[1])
   minI=1
   for(i=1;i<=len;i++){
       if(abs(arr[i])<min){
           min=abs(arr[i])
           minI=i
       }
   }
   split($1,arr2,"|")
   print(arr2[minI],min)   
}' file

出力:

Dragon 20
B 1
于 2013-02-26T15:58:42.633 に答える