入力ファイル
Cat|Dog|Dragon -40|1000|-20
K|B|L|D|E -9|1|-100|-8|9
出力ファイル:
Dragon 20
B 1
ワークフローは次のようなものです: 列 2 で最小絶対値のインデックスを見つけ、このインデックスを使用して列 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)
}
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]
し、対応するキーと値をタブで区切って出力します。
次の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