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

Я хотел бы разделить первый столбец на основе разделителя, здесь - . Основываясь на последнем значении, последний столбец, здесь столбец 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 

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

  • cd в неизвестный каталог по известному пути
  • сортировать CSV по количеству столбцов в строках?
  • В чем разница между запуском «bash script.sh» и «./script.sh»?
  • Всякий раз, когда я набираю неправильную команду, мой терминал пытается запустить эту команду в фоновом режиме
  • Как избежать необходимости выдавать «y» несколько раз при удалении защищенного файла
  • Получить список приложений, которые воспроизводят звук
  • разные результаты от awk и grep
  • Использование скрипта Fifo
  • Какая конфигурация существует в CentOS, но не в Ubuntu, которая показывает имя пользователя @ hostname для сеансов удаленного терминала?
  • Как мне обращаться с каталогами, в которых есть пробелы в именах из `find`?
  • Манипулировать имя файла с помощью команды find
  • Пространства рядом с трубами
  • 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 – это что-то еще, исходное значение сохраняется.
    Linux и Unix - лучшая ОС в мире.