거대한 ASCII 파일에 숫자 추가

거대한 ASCII 파일에 숫자 추가

배경:

(1) 다음은 내 ASCII 파일(600Mb 이상) 일부의 스크린샷입니다.

여기에 이미지 설명을 입력하세요.

(1.1) 이것은 코드의 일부입니다:

 0, 0, 0, 0, 0, 0, 0, 0, 3.043678e-05, 3.661498e-05, 2.070347e-05, 
    2.47175e-05, 1.49877e-05, 3.031176e-05, 2.12128e-05, 2.817522e-05, 
    1.802658e-05, 7.192285e-06, 8.467806e-06, 2.047874e-05, 9.621194e-05, 
    4.467542e-05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.000421869, 
    0.0003081213, 0.0001938675, 8.70334e-05, 0.0002973858, 0.0003385935, 
    8.763598e-05, 2.743326e-05, 0, 0.0001043894, 3.409237e-05, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.503832e-05, 1.433673e-05, 2.557402e-05, 
    3.081098e-05, 4.044465e-05, 2.480817e-05, 2.681778e-05, 1.533265e-05, 
    2.3156e-05, 3.193812e-05, 5.325314e-05, 1.639066e-05, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 2.259782e-05, 0.0004197799, 2.65868e-05, 0.0002485498, 
    3.485129e-05, 2.454055e-05, 0.0002096856, 0.0001910835, 1.969936e-05, 
    2.974743e-05, 8.983165e-05, 0.0004263787, 0.0004444561, 0.000241368, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

(2) 각 빨간색 직사각형에는 74개의 요소가 포함되어 있습니다.

(3) 0이 아닌 각 항목에 숫자를 추가하고 싶습니다(예: 0.001).


내 생각:

(1) 내 친구는 이것이 이 작업에 도움이 될 수 있다고 말했지만 /perl저는 이 프로그래밍 스크립트를 처음 접했습니다.

(2) 전략은 각 숫자를 읽고

(i) if it is a zero, then neglect it; or,
(ii) if it is non-zero, then add 0.001 to this number and replace this number.

(3) 제가 걱정하는 점은 다음과 같습니다.

/perl과학적 표기법으로 숫자를 읽는 것이 가능 합니까 (예: 1.303637e-05는 실제로 0.00001303637과 같습니다)?

답변1

다음이 작동합니다.

perl -pe 's/([0-9.e-]+)/$1 == 0 ? $1 : .001 + $1/ge' < input.txt > output.txt
  • -p파일을 한 줄씩 처리
  • s/patern/replacement/대안입니다.
  • [0-9.e-]+주어진 문자(예: 숫자) 중 하나 이상과 일치합니다.
  • ()모든 숫자를 기억하세요$1
  • /g전체적으로 대체를 적용합니다. 즉, 필요한 만큼 여러 번 줄당 대체를 적용합니다.
  • /e코드 교체 평가
  • condition ? then : else"삼항 연산자"입니다. 조건이 true( $1 == 0즉, 기억된 숫자가 0과 같음)이면 숫자가 반환되고, 그렇지 않으면 0.001이 추가됩니다.

답변2

0이 아닌 모든 숫자가 과학적 표기법으로 되어 있어도 괜찮다면 다음을 시도해 보세요.

perl -F, -anle '
  for (@F) {$_=sprintf " %e",$_+0.0001 if $_+0}
  print join ",", @F
' file

관련 정보