다음과 같은 데이터 파일이 있습니다.
569158.650000 8.859e-02
579175.970000 8.659e-02
599177.990000 8.659e-02
첫 번째 열에서 첫 번째 행 값을 추출해야 합니다. 그런 다음 첫 번째 열을 3600으로 나누어야 합니다. 마지막으로 다음과 같이 결과를 새 데이터 파일의 첫 번째 열로 붙여넣어야 합니다.
0 8.859e-02
2.78 8.659e-02
8.33 8.659e-02
코드를 사용하여 위의 계산을 어떻게 수행할 수 있습니까?
답변1
awk
문제를 해결하기 위한 oneliner는 다음과 같습니다 .
awk '{printf "%.2f %s\n", $1/3600, $2}'
모든 행에 대해 이는 단순히 첫 번째 필드를 3600( )으로 나누고 두 개의 소수점( ) 뒤에 공백이 $1/3600
있는 부동 소수점으로 인쇄하고 두 번째 필드( )를 문자열( )로 인쇄한 다음 마지막으로 줄바꿈으로 인쇄합니다. 예를 들어 소수점 이하 6자리로 반올림하려면 로 변경하면 됩니다 .%.2f
$2
%s
%.2f
%.6f
예시 실행
$ cat <data
569158.650000 8.859e-02
579175.970000 8.659e-02
599177.990000 8.659e-02
$ awk '{printf "%.2f %s\n", $1/3600, $2}' <data >new_data
$ cat <new_data
158.10 8.859e-02
160.88 8.659e-02
166.44 8.659e-02
$ awk '{printf "%.6f %s\n", $1/3600, $2}' <data
158.099625 8.859e-02
160.882214 8.659e-02
166.438331 8.659e-02
답변2
#!/bin/bash
div=3600 #Divisor
scale=2 #Scale for output. Number of digits after decimal point.
while read -r line #Read file into variable line, line by line.
do
firstnum=$(echo $line | cut -d " " -f 1) #Pick the first number field
secondnum=$(echo $line | cut -d " " -f 2) #Pick the second number field
firstnum=$(echo "scale=${scale}; ${firstnum}/${div}" | bc -l) #Divide by $div with $scale places after decimal point.
echo "${firstnum} ${secondnum}" >> output #Output first and second column, seperated by space,to file named output.
done < input #input is name of input file.
이 스크립트는 input
말씀하신 형식으로 이름이 지정된 파일을 읽고 이름이 output
.
먼저 줄을 두 개의 필드로 자른 다음 첫 번째 필드를 3600으로 나누고 두 개의 소수점을 인쇄한 다음 줄의 새 숫자와 두 번째 숫자를 출력이라는 파일에 인쇄합니다.
오류 검사를 수행하지 않습니다. 오류가 발생하면 YMMV.