나는 약간의 변화로 어려움을 겪고 있습니다. 첫 번째 필드를 가져와 계산하는 방법그리고쉘에서 부동 소수점 숫자를 반올림하는 방법은 무엇입니까?
(열 사이의 공백)과 같은 파일이 있습니다.
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 파일이 생성됩니다.
작동 방식:
awk
a.txt의 첫 번째 열의 값을 65로 나눈 다음 python
내장 함수를 사용하여 round()
소수점을 반올림하는 데 사용됩니다 . 그런 다음 "for" 루프의 출력을 사용하여 c.txt 파일을 생성하고 이를 사용하여 paste
c.txt와 a.txt를 결합합니다.