Добавление повреждений между каждыми двумя словами в ударе

То, о чем Вы говорите, называют кластером Изображения Единой системы или иногда распределенной системой с разделяемой памятью (в большем количестве ограничивающего контекста). Существуют некоторые проекты, перечисленные на связанных страницах Wikipedia, которые необходимо изучить. Я использовал SGI Altix кластер (NUMAlink), и может быть довольно мощно, если у Вас есть процесс, который требует огромного объема потребляемой памяти.

С увеличением скорости ЦП и емкости памяти отдельных узлов, это, кажется, больше меньше популярного вычислительного метода кластеризации. Большинство людей использует API передачи сообщений, чтобы позволить параллельному вычислению связываться по быстрому взаимосвязанному или простому Ethernet.

2
26.11.2018, 00:40
3 ответа
output=executeSQLQuery "$QUERY" |sed 's/: [^ ]* /& \n/g'

Вышеупомянутые урожаи команды

user@user:~> z="Your Name: Samanta Your Phone: 111-111-1111 Email: testemail@test.com"
user@user:~> echo $z | sed 's/: [^ ]* /& \n/g'
Your Name: Samanta  
Your Phone: 111-111-1111  
Email: testemail@test.com
user@user:~> 

Команда использовала соответствие regex т.е. двоеточие (': ') сопровождаемый пространством и затем всеми не пробелы. Однако, если данные будут содержать какой-либо пробел затем, то эта команда потерпит полный провал.

2
27.01.2020, 21:57
  • 1
    Да, я попробовал это прежде, и это перестало работать, где данные имеют пробел. –  user997452 24.09.2012, 20:12
  • 2
    , почему Вы не делаете чего-то как SELECT 'Your Name:'+'\t' с Вашим Запросом.... это поможет как флаг разделителя.. –  perilbrain 24.09.2012, 21:49

Проблема с выводом состоит в том, что требуется сгруппировать три слова (хотя логически пара "ключ-значение") в первой строке вывода, еще трех в следующих и заключительных двух в третьей строке.

Для этой конкретной проблемы быстрый путь был бы:

executeSQLQuery "$QUERY" | awk '{print $1 " " $2 " " $3 "\n" $4 " " $5 " " $6 "\n" $7 " "$8 }'

Но обычно это лучше изменило бы запрос на что-то как:

SELECT FullName as 'Your name', Phone as 'Your phone', Email FROM Table1 WHERE EmpID=001;

и затем получая строку наряду с именами столбцов и создавая желаемый вывод в жемчуге или некотором другом языке.

1
27.01.2020, 21:57

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

Ваша проблема вызывается тем, что Ваша функция executeSQLQuery (или сценарий или программа) возвращает отформатированный вывод, а не просто данные...., и похоже, что это делает это, потому что Ваша строка $QUERY говорит это.

Можно ли добраться executeSQLQuery или связанная функция/сценарий для возврата просто данных в легко проанализированном формате (как CSV или разграниченный вкладкой), без заголовков столбцов?

(другими словами, "не Делают Этого, Затем". Разделите презентацию результатов сбора данных),

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

QUERY="SELECT FullName, Phone, Email FROM Table1 WHERE EmpID=001;"

# disable globbing which would otherwise be performed upon non-quoted
# command substitution (except in zsh):
set -f

# set the input-field-separator to tab and newline (but not space characters)
# execute the query and store the results in the array $output
IFS=$'\t\n' output=($(executeSQLQuery "$QUERY"))

# now print the output array in the format we want.
printf "Your Name: %s\nYour Phone: %s\nEmail: %s\n" "${output[@]}"

Вот рабочий пример с помощью mysql. Я не знаю что Ваш executeSQLQuery но я просто сделал тест mysql базой данных (названный 'спамом'), заполнил его с Вашими данными в качестве примера и определил executeSQLQuery как функция как так:

$ executeSQLQuery() { mysql --batch --silent junk -e "$@" ;}

Отметьте --batch и --silent опции. Они говорят mysql давать мне просто данные без заголовков или другого форматирования. Я не использовал -u и -p опции для пользователя и пароля, потому что я создал ~/.my.cnf файл с моими учетными данными в нем.

Теперь, давайте выполним запрос, покажем то, что массив ouput содержит, и затем структурная распечатка программы он с printf.

$ set -f; IFS=$'\t\n' output=($(executeSQLQuery 'Select Fullname,Phone, Email from Table1 where EmpId = 001'))

$ set | grep output
output=([0]="Samantha" [1]="111-111-1111" [2]="testemail@test.com")

$ printf "Your Name: %s\nYour Phone: %s\nEmail: %s\n" "${output[@]}"
Your Name: Samantha
Your Phone: 111-111-1111
Email: testemail@test.com

BTW, удар не поддерживает многомерные массивы, поэтому если бы Ваш запрос возвращает несколько строк, необходимо было бы записать некоторый цикл для печати [0.. 2], [3.. 5], [6.. 8] и так далее как отдельные записи. Например, я добавил вторую запись на Таблицу 1 и изменил запрос для возврата, все строки.... вот то, на что выходной массив похож теперь:

$ set -f; IFS=$'\t\n' output=($(executeSQLQuery 'Select Fullname,Phone, Email from Table1'))
$ set | grep output
output=([0]="Samantha" [1]="111-111-1111" [2]="testemail@test.com" [3]="Fred" [4]="222-222-2222" [5]="testemail2@test.com")

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

2
27.01.2020, 21:57
  • 1
    Это, кажется, решение для моего вопроса.Большое спасибо! Я попробую это. спасибо –  user997452 24.09.2012, 20:13
  • 2
    Привет Craig, я попробовал это и когда я повторяю его, это работает отлично. Я сохранил его в переменной как это: <br/> printf-v myvariable $ 'Ваше Имя: Телефон %s\nYour: %s\n\Email: %s\n' "$ {вывод}". <br/> Это печатает как ожидалось, но когда я пытаюсь повторить (с-e опцией) "myvariable" в электронном письме, которое я отсылаю, форматирование исчезает. –  user997452 25.09.2012, 01:25
  • 3
    в предположении, попытайтесь поместить двойные кавычки " вокруг "$myvariable", когда Вы повторяете его - который сохранит любые переводы строки (иначе оболочка разделит их). Кроме того, я не думаю, что Вы хотите обратную косую черту перед E в \Email. –  cas 25.09.2012, 02:31
  • 4
    Спасибо, но я использовал <br/> тег вместо \n, и он работал, так как Тип контента является текстом/HTML. Спасибо за всю Вашу справку! Действительно цените усилие, которое Вы вставляете. –  user997452 25.09.2012, 07:07

Теги

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