-1
<property>
  <name>mapred.tasktracker.map.tasks.maximum</name>
  <value>2</value>
  <description>The maximum number of map tasks that will be run
  simultaneously by a task tracker.
  </description>
</property>

<property>
  <name>mapred.tasktracker.reduce.tasks.maximum</name>
  <value>2</value>
  <description>The maximum number of reduce tasks that will be run
  simultaneously by a task tracker.
  </description>
</property>

я хочу изменить просто (mapred.tasktracker.map.tasks.maximum value) по своему значению в выводе моего скрипта, и не изменяю другое значение (максимальное количество задач сокращения), кроме него, как я могу это сделать ?!

2 ответа2

0

1. Используйте синтаксический анализатор XML

Если вы собираетесь манипулировать XML, вам следует использовать инструмент, разработанный специально для этой цели.  (В Unix таких инструментов нет.)  Это неоднократно обсуждалось на бирже стека:

XMLStarlet (который упоминал Вернер Хенце), кажется, широко рекомендуется.

2. Тем не мение, …

... если ваши данные хорошо себя ведут (например, одна пара совпадающих тегов на строку; нет строк, которые похожи на теги, но не таковы; и т.д.), Вы можете сделать это с помощью стандартных команд Unix.

2.1 awk

awk '
        /<name>mapred.tasktracker.map.tasks.maximum<\/name>/ { inzone=1 }
        inzone && /<value>.*<\/value>/ { sub(/<value>.*<\/value>/, "<value>4</value>"); inzone=0 }
        /<\/property>/ { inzone=0 }
        1
    '
  • После распознавания строки mapred.tasktracker.map.tasks.maximum установите флаг inzone чтобы указать, что мы хотим изменить следующее value мы видим.
  • Если мы видим value пока мы находимся в зоне (inzone), замените его новым значением и обнулите флаг inzone .
  • Если мы видим конец property , снимите флажок, потому что мы больше не в данных mapred.tasktracker.map.tasks.maximum .

2.2 сед

sed '/<name>mapred.tasktracker.map.tasks.maximum<\/name>/ {
        : loop
        n
        s/<value>.*<\/value>/<value>4<\/value>/
        t
        /<\/property>/b
        b loop
    }'
  • После распознавания строки mapred.tasktracker.map.tasks.maximum введите командный блок {…} .
  • Начните блок с метки (loop), чтобы мы могли выполнять следующие команды несколько раз (пока не найдем value).
  • Перейти к следующей строке.
  • Попробуйте подставить значение.
  • Если замена удалась, перейдите к концу цикла.
  • Если мы видим конец property , переходите к концу цикла, потому что мы больше не в данных mapred.tasktracker.map.tasks.maximum .
  • В противном случае перейдите к началу цикла и повторите вышеописанное.
0

Прежде всего, ваш файл XML, кажется, не является полным, в нем отсутствует что-то вроде

<?xml version="1.0"?>
<top>
...
</top>

Если вы добавите это, вы можете использовать xmlstarlet для изменения файла XML.

xmlstarlet ed -P -u "/top/property/name[text()='mapred.tasktracker.map.tasks.maximum']/../value" -v 4 nameofxmlfile

Для получения информации о том, что это делает, вы можете man xmlstarlet и xmlstarlet ed --help .

xmlstarlet будет работать в режиме редактирования (ed), он загрузит файл nameofxmlfile , сохранит пробельные узлы (-P) и изменит значение узла на 4 (-v 4). Узел, который нужно изменить, определяется XPath "/top/property/name[text()='mapred.tasktracker.map.tasks.maximum']/../value" . Это следует читать слева направо: начать с верхнего уровня (/), перейти в top узел, перейти в каждый подузел property , перейти в подузел name , отфильтровать только те имена, которые имеют заданный текст ([text()='mapred.tasktracker.map.tasks.maximum']), поднимитесь на один узел вверх (.. , снова вернитесь к свойству), затем перейдите к подузлу value .

Результат будет распечатан на стандартный вывод. Если вы хотите, чтобы xmlstarlet изменил файл, добавьте -L после -P .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .