여러 시퀀스를 곱하여 텍스트 파일에 새 열을 추가하는 방법은 무엇입니까?

여러 시퀀스를 곱하여 텍스트 파일에 새 열을 추가하는 방법은 무엇입니까?

4개의 열과 300개의 행이 있는 텍스트 파일이 있습니다. 100번째 행이 1*0.02, 2*0.02...의 곱이 되고 100번째 행이 2.2, 2.4...가 되는 다섯 번째 열을 추가하고 싶습니다.

0.02 
0.04
.
.
.
2           (in 100 lines)
2.2
2.4
.
.
.
12           (in 300 lines)

내 텍스트 파일:

# "Frame" "Timestep" "WignerSeitz.interstitial_count" "WignerSeitz.vacancy_count"
0 0 0 0 
1 100 0 0 
2 200 0 0 
3 300 0 0 
.
.
98 9800 16 16 
99 9900 16 16 
100 10000 15 15
.
.
299 29900 48 48 
300 30000 55 55

예상 출력:

# "Frame" "Timestep" "WignerSeitz.interstitial_count" "WignerSeitz.vacancy_count"
0 0 0 0 0
1 100 0 0 0.02 
2 200 0 0 0.04
3 300 0 0 0.06
.
.
98 9800 16 16 1.96
99 9900 16 16 1.98
100 10000 15 15 2
.
.
299 29900 48 48 11.8 
300 30000 55 55 12 

답변1

100 이후를 의미한다고 가정하면 그 이후의 모든 레코드에 대해 0.2를 추가해야 합니다. 이를 사용하면 awk다음 코드와 같은 작업을 수행할 수 있습니다.

awk -v x=2 '{if($1<101){print $0 FS ($1*0.02)}else{x=x+0.2; print $0 FS x}}' file.txt

어디:

-v초기값이 있는 변수를 awk사용하고 있음을 알리는 데 사용됩니다.x2

$1<101첫 번째 열이 다음보다 작으면 코드의 첫 번째 부분이 작동하도록 할 수 있습니다.101

FSawk파일의 필드 구분 기호를 포함하는 정적 변수입니다 .

그런 다음 요구 사항에 따라 단계를 조정할 수 있습니다.

답변2

내가 이해한 바에 따르면 열 1 곱하기 0.2로 계산되는 열 5가 필요합니다.

이는 다음을 통해 수행할 수 있습니다 awk.

 gawk '{printf "%s %.2f\n", $0,$1*0.02}'

답변3

사양과 예제 출력 간에는 차이가 있습니다. 101행에서 300행까지의 단계 크기를 원 0.2하지만 마지막 행은 12 -로 끝나는데 이는 불가능합니다. 0.2의 200단계는 "40"을 생성하며 이는 42마지막 행의 $5 항목을 구성합니다 . 이것이 사실이라면 시도해 보세요.

$ awk '{print $0, ($1>100)*-18+$1*.02*(1+($1>100)*9)}' file
0 0 0 0  0
1 100 0 0  0.02
2 200 0 0  0.04
3 300 0 0  0.06
. 0
. 0
98 9800 16 16  1.96
99 9900 16 16  1.98
100 10000 15 15 2
101 10100 15 15 2.2
102 10200 15 15 2.4
. 0
199 19900 15 15 21.8
200 20000 15 15 22
201 20100 15 15 22.2
. 0
299 29900 48 48  41.8
300 30000 55 55 42

관련 정보