次の数値リストがあります。
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