Bash에서 내용 한 줄 읽기

Bash에서 내용 한 줄 읽기

내용이 이 순서대로 공백으로 구분된 파일이 있습니다.

  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

관련 정보