Считайте содержание в строке в ударе

Не волнуйтесь об использовании других дисплеев сначала. Вероятно, единственное время, которое необходимо будет взволновать по поводу дисплеев, - когда Вы соединяетесь с удаленным компьютером и подключаете свои удаленные приложения к дисплею.

Ваши приложения, которые Вы пишете, не должны будут непосредственно волноваться о дисплее; X библиотек будут заботиться о нем для Вас.

2
10.11.2013, 21:27
5 ответов

В то время как теговый самое простое к 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
3
27.01.2020, 21:53

Пока данные являются пространством, разграничил Вас, может загрузить содержание файла в массив как так:

arr=$(< data.txt)

Однажды данные, загруженный в массив, $arr можно затем использовать a for цикл, чтобы пройти его и выполнить Ваше подразделение 1 024.

$ 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

Ссылки

2
27.01.2020, 21:53

Для этой простой арифметической задачи можно придерживаться для окружения встроенных конструкций и вызова read чтобы читать и разделить первую строку или использование управляют, чтобы замена считала вход и разделила его.

С другой стороны, можно рассматривать это как проблему обработки текста и вызов awk сделать целую обработку.

Если Ваша фактическая задача требует передачи каждого числа к отдельной команде, можно использовать xargs. xargs имеет странный формат ввода, но если Ваш вход не имеет ни одного из \'" Вы не должны волноваться об этом.

<input.txt xargs -n1 somecommand
2
27.01.2020, 21:53

Суть сценариев оболочки должна выполнить как можно меньше команд. Здесь, awk обычно команда, которая лучше всего разработана, чтобы разделить строки на поля и сделать арифметику:

awk '{for (i = 1; i<= NF; i++) $i = $i/1024; print}' < your-file

Используя циклы оболочки в оболочках часто знак плохой практики сценариев оболочки.

2
27.01.2020, 21:53
  • 1
    Shell являются плохой практикой? Почему это? –   11.11.2013, 00:22

Для больших списков я обычно создаю в противоречии с, отрывают одну строку за один раз, затем независимо от того, что переменная операция, которую Вы хотите выполнить, может быть сделана надежно.. У меня были большие массивы (для строки в cat foo.bar; сделайте), переходят к частям.. К остроумию:

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
-2
27.01.2020, 21:53
  • 1
    Ай. UUOC, пропуская кавычки, 4 выполненные команды, 1 канал и 1 замена команды на каждую строку в файле, файл, считанный из запуска при каждом повторении.Ну же... –  Stéphane Chazelas 09.11.2013, 22:55
  • 2
    Вызов head и tail однажды на строку напрасно устраняет вход non-seekable (например, канал) и является очень медленным для средних и крупных файлов. –  Gilles 'SO- stop being evil' 10.11.2013, 21:28

Теги

Похожие вопросы