Обрабатывать столбец с текстом, в котором есть пробелы, как 1 поле

Вы можете ограничить выполнение процесса определенным (набором) ядер с помощью набора задач .

taskset 3 mycommand

(3 — это битовая маска, означающая, что mycommand будет выполняться только на ядрах 0 и 1.)

Однако это не изменит количество процессоров, используемых процессом. думает, что у тебя есть. Это всего лишь инструкция ядру не планировать процесс на процессорах, отличных от перечисленных в битовой маске. Поэтому, если программа выполняет проверку лицензии на основе количества процессоров, это, вероятно, не поможет.

Определенно сработает решение — запустить процесс на виртуальной машине только с двумя (виртуальными) ядрами. Однако это может стоить производительности.

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

0
09.02.2017, 22:05
5 ответов

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"

Он автоматически удалит все завершающие пробелы.

1
28.01.2020, 02:25

Думаю, вам может понадобиться что-то вроде

awk '{$2=""; print;}' input
0
28.01.2020, 02:25

Для извлечения полей на основе шаблона 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
  }'
1
28.01.2020, 02:25

Если это небольшой файл и текст всегда находится в конце, в качестве альтернативы вы можете рассмотреть классический подход 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 при чтении может работать довольно медленно в файлах с большими данными, но вы можете попробовать в своем случае.

0
28.01.2020, 02:25

Замените $ 2 (которые вы все равно не используете) на неиспользуемый символ (тот, которого нет в ваших строках). {{1} } После этого просто выполните:

awk '{$2="+";print}' input-file.txt | awk -F "+" '{printf "<tag>%d</tag>\n<tag>%s</tag>\n",$1,$2}'

Выше я использовал плюс «+» в качестве разделителя.

Это не самое элегантное решение, но оно простое.

1
28.01.2020, 02:25

Теги

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