Bash에서 숫자를 세고 반올림합니다.

Bash에서 숫자를 세고 반올림합니다.

나는 약간의 변화로 어려움을 겪고 있습니다. 첫 번째 필드를 가져와 계산하는 방법그리고쉘에서 부동 소수점 숫자를 반올림하는 방법은 무엇입니까?

(열 사이의 공백)과 같은 파일이 있습니다.

1533 C_P.doc
691 C_M.doc
905 G_S.doc
945 J_Z.doc
1549 J_M.doc
1701 L_B.doc

숫자 열을 가져와서 각 숫자를 65로 나눈 다음(반올림) 해당 숫자가 포함된 새 열을 추가하고 싶습니다(가급적 왼쪽에 있음). 즉

24 1533 C_P.doc
11 691 C_M.doc
14 905 G_S.doc
15 945 J_Z.doc
24 1549 J_M.doc
27 1701 L_B.doc

bash 스크립트에서 이 작업을 수행하고 싶습니다. 가능합니까? 필요한 경우 중간 포스트를 제거할 수 있습니다(더 쉽게 제거할 수 있는 경우).

[우분투 14.04]

답변1

awk중간 열을 전달 하고 유지합니다.

awk '{printf("%.f ", ($1/65)+0.5)}1' infile > outfile
24 1533 C_P.doc
11 691 C_M.doc
14 905 G_S.doc
15 945 J_Z.doc
24 1549 J_M.doc
27 1701 L_B.doc

합격 awk및 불합격 뉴얼 기둥:

awk '{printf("%.f", ($1/65)+0.5); $1=""}1' infile > outfile
24 C_P.doc
11 C_M.doc
14 G_S.doc
15 J_Z.doc
24 J_M.doc
27 L_B.doc

는 함수를 대체하는 +0.5데 사용되며 다음 숫자로 반올림됩니다. ceil()마지막으로 1기본 인쇄를 활성화합니다.

답변2

당신은 그것을 사용할 수 있습니다 perl:

$ perl -MPOSIX=ceil -anle '$F[0] = ceil($F[0]/65);print "@F"' file
24 C_P.doc
11 C_M.doc
14 G_S.doc
15 J_Z.doc
24 J_M.doc
27 L_B.doc

답변3

python쉘에서 사용하고 이것이 a.txt귀하의 파일이라고 가정하는 것이 마음에 들지 않으면 다음을 수행하십시오 .

[sreeraj@server ~]$ cat a.txt
1533 C_P.doc
691 C_M.doc
905 G_S.doc
945 J_Z.doc
1549 J_M.doc
1701 L_B.doc
[sreeraj@server ~]$ for i in $(awk -v c=65 '{ print $1/c }' a.txt) ; do python -c 'print int(round('$i',0))' ; done >> b.txt
[sreeraj@server ~]$ paste b.txt a.txt > c.txt
[sreeraj@server ~]$ cat c.txt
24      1533 C_P.doc
11      691 C_M.doc
14      905 G_S.doc
15      945 J_Z.doc
24      1549 J_M.doc
26      1701 L_B.doc
[sreeraj@server ~]$

그러면 원하는 출력이 포함된 c.txt 파일이 생성됩니다.

작동 방식:

awka.txt의 첫 번째 열의 값을 65로 나눈 다음 python내장 함수를 사용하여 round()소수점을 반올림하는 데 사용됩니다 . 그런 다음 "for" 루프의 출력을 사용하여 c.txt 파일을 생성하고 이를 사용하여 pastec.txt와 a.txt를 결합합니다.

관련 정보