위치에 따라 숫자 내의 숫자 곱하기

위치에 따라 숫자 내의 숫자 곱하기

다음과 같은 숫자 목록이 있습니다.

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

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

관련 정보