Вы можете ограничить выполнение процесса определенным (набором) ядер с помощью набора задач
.
taskset 3 mycommand
(3
— это битовая маска, означающая, что mycommand
будет выполняться только на ядрах 0 и 1.)
Однако это не изменит количество процессоров, используемых процессом. думает, что у тебя есть. Это всего лишь инструкция ядру не планировать процесс на процессорах, отличных от перечисленных в битовой маске. Поэтому, если программа выполняет проверку лицензии на основе количества процессоров, это, вероятно, не поможет.
Определенно сработает решение — запустить процесс на виртуальной машине только с двумя (виртуальными) ядрами. Однако это может стоить производительности.
Cgroups предлагает промежуточный способ ограничения ресурсов, которые может использовать процесс. Я не знаю, может ли он эффективно скрывать процессоры от процесса или действует только как taskset
.
awk
полезен, если данные поступают в четко обозначенных записях. Этих данных нет. Однако данные представлены в формате « integer stuff the_rest
», где как « integer
», так и « stuff
» не будут содержать пробелов. Это именно то, что любит читать утилита read
. Он будет читать слова, разделенные пробелами, столько, сколько вы дадите ему для чтения переменных, а затем поместит «остаток» строки в последнюю переменную.
bash-4.4$ while read -r integer stuff the_rest; do printf '%d\t"%s"\n' "$integer" "$the_rest"; done <data
12 "Cinema - 3D/Multiplex"
7 "Status Update"
5 "Movie"
Он автоматически удалит все завершающие пробелы.
Думаю, вам может понадобиться что-то вроде
awk '{$2=""; print;}' input
Для извлечения полей на основе шаблона perl
обычно лучше, чем awk
:
perl -lne '
if (/^\s*(\d+)\s*\S+\s*(.*?)\s*$/) {
print "<tag>$1</tag><tag>$2</tag>"
}'
который на ваш ввод дает:
<tag>12</tag><tag>Cinema - 3D/Multiplex</tag>
<tag>7</tag><tag>Status Update</tag>
<tag>5</tag><tag>Movie</tag>
Это означает, что вы можете делать более сложные вещи, например, правильно кодировать HTML, если необходимо, например:
perl -Mopen=locale -MHTML::Entities -lne '
if (/^\s*(\d+)\s*\S+\s*(.*?)\s*$/) {
print map {"<tag>" . encode_entities($_) . "</tag>"} $1, $2
}'
Или кодирование XML:
perl -Mopen=locale -MXML::LibXML -lne '
if (/^\s*(\d+)\s*\S+\s*(.*?)\s*$/) {
print map {
my $e = XML::LibXML::Element->new("tag");
$e->appendText($_);
$e->toString} $1, $2
}'
Если это небольшой файл и текст всегда находится в конце, в качестве альтернативы вы можете рассмотреть классический подход bash, например:
while IFS=' ' read -r int1 int2 text;do
#do your stuff
done <file
Как и в случае с while - read, последний var $ text в команде чтения получит все оставшиеся поля как одно поле.
Тестирование:
$ IFS=' ' read -r int1 int2 text <<<"10 5 some text here"
$ echo "$text"
some text here
Bash при чтении может работать довольно медленно в файлах с большими данными, но вы можете попробовать в своем случае.
Замените $ 2 (которые вы все равно не используете) на неиспользуемый символ (тот, которого нет в ваших строках). {{1} } После этого просто выполните:
awk '{$2="+";print}' input-file.txt | awk -F "+" '{printf "<tag>%d</tag>\n<tag>%s</tag>\n",$1,$2}'
Выше я использовал плюс «+» в качестве разделителя.
Это не самое элегантное решение, но оно простое.