根据数字位置将数字内的数字相乘

根据数字位置将数字内的数字相乘

我有这样的数字列表:

0987656787689
2345453326780
3453212332345
1324532449876
1234532444568
3245321343456
1324354532376
1234532153457

我想根据第六位和第七位数字相乘的结果对数字进行排序,所以结果是这样的:

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

Perl 来救援!

perl -F// -lane 'print $F[5] * $F[6]' < file
  • -n逐行读取输入
  • -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

相关内容