заменить содержимое одного поля на основе содержимого в другом поле

Я хотел бы разделить первый столбец на основе разделителя, здесь - . Основываясь на последнем значении, последний столбец, здесь столбец 2, должен быть заполнен. Если значение равно 01 или 99 замените их на 2 или 1 соответственно.

 #input PE01-02-01 -9 PE01-02-99 -9 PE01-03-01 -9 PE01-03-99 -9 PE01-05-01 -9 PE01-05-99 -9 #output PE01-02-01 2 PE01-02-99 1 PE01-03-01 2 PE01-03-99 1 PE01-05-01 2 PE01-05-99 1 

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

  • Как скриптировать эту функцию массового переименования?
  • читать значения столбца из файла и печатать один за другим
  • Я хочу сконденсировать список диапазонов (от-до)
  • sed возвращает следующую ошибку sed: -e выражение # 1, char 101: неизвестный параметр `s '
  • Печать текстового файла из номера строки в другой после поиска строк
  • Захват в переменных оболочки аргументов после команды (между скобками)
  • Почему мне не нужно избегать класса символов в sed, но мне нужно избегать остальных?
  • `pwd`, но опустить первые n каталогов
  • 2 Solutions collect form web for “заменить содержимое одного поля на основе содержимого в другом поле”

    Вы могли бы сделать это несколько загадочно с помощью вложенных условных операторов?: (Aka trernary operator)

     awk '{$2 = $1 ~ /-01$/? 2: $1 ~ /-99$/? 1: $1; print}' input PE01-02-01 2 PE01-02-99 1 PE01-03-01 2 PE01-03-99 1 PE01-05-01 2 PE01-05-99 1 

    вперемежку

     awk '{n = split($1, a, "-"); $2 = a[n] == "01" ? 2: a[n] == "99"? 1: a[n]; print}' input 

    Решение Perl:

     perl -ane 'BEGIN { $" = "\t" } $F[0] =~ /(..)$/, $F[-1] = { "01" => 2, "99" => 1 }->{$1} || $F[-1]; print "@F\n" ' input_file > output_file 
    • -n читает ввод строки за строкой.
    • -a разбивает каждую строку на пробел на массив @F.
    • $" установлен на вкладку так, чтобы элементы массива были разделены вкладками в двойных кавычках ( "@F" )
    • $F[0] сопоставляется с регулярным выражением, которое извлекает последние два символа в $1
    • $F[-1] , последний столбец, установлен на 2 или 1 на основе $1 . Если $1 – это что-то еще, исходное значение сохраняется.
    Interesting Posts

    Выполнить строки вывода команд в качестве другой команды в Linux

    Как заставить службу /etc/xdg/autostart/app.desktop ждать службы (systemd)?

    Исключая закрытые разделители с разрезом

    Почему, когда я пытаюсь выполнить программу как обычный пользователь, мне становится отказано, и когда я выполняю его с помощью sudo, я получаю «Not Found»

    ping не прекращается, когда iptables REJECT-s это

    Мышь выходит Экран слишком далеко справа (Ubuntu, Kde)

    unix test, когда использовать eq vs = vs == в тестовых командах?

    Как установить firetools в whonix?

    Создать фальшивую оболочку в Linux?

    Сортировка файлов в каталогах, названных префиксом файла

    Как запустить команды Emacs nnrss- *

    Тестирование сети интрасети

    Руководство по сборке ядра Linux: результирующий двоичный файл в 10 раз больше, чем предварительно скомпилированные двоичные файлы

    Opticon OPN-3002i нет ttyUSB0

    Являются ли переменные среды видимыми для непривилегированных пользователей в Linux?

    Linux и Unix - лучшая ОС в мире.