내용이 이 순서대로 공백으로 구분된 파일이 있습니다.
4096 1230 4560 1024.... n
각 숫자를 어떻게 읽고 다른 명령에 전달할 수 있습니까? 즉, 각 숫자를 1024로 나누는 것입니다.
답변1
표시된 경우세게 때리다가장 쉬운 방법은 read
배열에 넣는 것입니다.
bash-4.1$ read -a l < file
그런 다음 다음과 같은 값을 반복할 수 있습니다.
bash-4.1$ for n in "${l[@]}"; do echo "$n / 1024 ≈ $((n/1024)) = $(bc -l<<<"$n/1024")"; done
4096 / 1024 ≈ 4 = 4.00000000000000000000
1230 / 1024 ≈ 1 = 1.20117187500000000000
4560 / 1024 ≈ 4 = 4.45312500000000000000
1024 / 1024 ≈ 1 = 1.00000000000000000000
답변2
데이터가 공백으로 구분되어 있으면 다음과 같이 파일 내용을 배열로 로드할 수 있습니다.
arr=$(< data.txt)
데이터를 배열에 로드한 후 루프를 사용하여 반복하고 1024로 나눌 $arr
수 있습니다.for
$ for num in ${arr[*]}; do
res=$( expr $num / 1024 )
echo "$num / 1024 = $res"
done
예
$ for num in ${arr[*]}; do res=$( expr $num / 1024 ); echo "$num / 1024 = $res";done
4096 / 1024 = 4
1230 / 1024 = 1
4560 / 1024 = 4
1024 / 1024 = 1
정수 대신 부동 소수점 결과를 얻으려면 bc
다음 방법을 사용하면 됩니다.
$ for num in ${arr[*]}; do
res=$(echo "scale=2; $num/1024" |bc)
echo "$num / 1024 = $res"
done
4096 / 1024 = 4.00
1230 / 1024 = 1.20
4560 / 1024 = 4.45
1024 / 1024 = 1.00
에 전달된 값을 변경하여 소수 자릿수를 제어할 수 있습니다 scale=
. 환경 `scale=5
:
4096 / 1024 = 4.00000
1230 / 1024 = 1.20117
4560 / 1024 = 4.45312
1024 / 1024 = 1.00000
인용하다
답변3
쉘 스크립트의 요점은 가능한 한 적은 수의 명령을 실행하는 것입니다. 여기서 awk
일반적으로 행을 필드로 분할하고 산술 연산을 수행하는 데 가장 적합한 명령은 다음과 같습니다.
awk '{for (i = 1; i<= NF; i++) $i = $i/1024; print}' < your-file
쉘에서 쉘 루프를 사용하는 것은 일반적으로 쉘 스크립팅 관행이 좋지 않다는 신호입니다.
답변4
큰 목록의 경우 일반적으로 한 번에 하나씩 행을 추출하는 카운터를 구축한 다음 원하는 모든 변수 조작을 안정적으로 수행할 수 있습니다. cat foo.bar
조각 모음된 큰 배열( ; do 행의 경우)이 있습니다. 재치:
InCt=`cat foo.bar|wc -l`
RunCt=1
while [ $InCt -ge $RunCt ]; do
LINE=`head -${RunCt} foo.bar|tail -1`
# do whatever you need with the line
let RunCt="$RunCt +1"
done