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

Я хотел бы разделить первый столбец на основе разделителя, здесь - . Основываясь на последнем значении, последний столбец, здесь столбец 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 Command
  • Как получить строки, чей n-й столбец содержит m-й столбец
  • Как совместить точную строку с помощью `sed`? Но не его часть.
  • Как вставить содержимое файла в другой файл перед шаблоном (маркером)?
  • Используя sed, чтобы заменить только первые два регулярных выражения с разными строками
  • замените символ из строки, которая находится между первым и вторым поиском, используя sed или awk
  • 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 - лучшая ОС в мире.