位置に応じて数字内の数を掛ける

位置に応じて数字内の数を掛ける

次の数値リストがあります。

0987656787689
2345453326780
3453212332345
1324532449876
1234532444568
3245321343456
1324354532376
1234532153457

6番目の数字と7番目の数字を掛けた結果に基づいて数字をソートしたいので、結果は次のようになります。

3245321343456
3453212332345
1234532153457
1234532444568
1324532449876
2345453326780
1324354532376
0987656787689

答え1

使用awk:

$ awk '{ print substr($0,6,1)*substr($0,7,1) }' <file
30
15
2
6
6
2
20
6

上記の結果に基づいて元の数字を並べ替えます。 (これは後続の質問です。コメントから):

$ awk '{ print substr($0,6,1)*substr($0,7,1) }' <file | paste - file | sort -n | cut -f 2
3245321343456
3453212332345
1234532153457
1234532444568
1324532449876
2345453326780
1324354532376
0987656787689

これにより、乗算結果を元の数字と一緒にタブ区切りの2つの別々の列に貼り付け、数字で並べ替えて2番目の列(元の数字)を抽出します。

答え2

Perlが救出に来る!

perl -F// -lane 'print $F[5] * $F[6]' < file
  • -n入力を1行ずつ読みます。
  • -a各行を @F 配列に分割する
  • -F分ける方法を言う
  • //どこでも分割されることを意味します。つまり、単一の文字に分割されます。
  • -l入力から改行文字を削除し、出力に追加します。

答え3

柔軟なソート機能のためにGNU awkを使用してください。

function compare_product(i1, v1, i2, v2) {
  return substr(v1, 6, 1) * substr(v1, 7, 1) - \
         substr(v2, 6, 1) * substr(v2, 7, 1);
}

BEGIN {
  PROCINFO["sorted_in"]="compare_product";
}

{
  elements[NR]=$0
}

END {
  asort(elements, sorted_elements, "compare_product");
  for (element in sorted_elements) {
    print sorted_elements[element];
  }
}

これを行うには、内容全体をメモリに保持し、実装が簡単であるため、必要以上に製品を再計算する必要があります。

答え4

mawk次のような単純な(内部整列なし)アプローチを試すこともできます(いくつかの改善が役立つかもしれません)。

awk  '{print $6 * $7, $0 | ("sort -n > TMP" )} END {close ("TMP"); FS = " "; while (1 == getline < "TMP") print $2}' FS="" file
3245321343456
3453212332345
1234532153457
1234532444568
1324532449876
2345453326780
1324354532376
0987656787689

関連情報