заменить содержимое одного поля на основе содержимого в другом поле
Я хотел бы разделить первый столбец на основе разделителя, здесь -
. Основываясь на последнем значении, последний столбец, здесь столбец 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
не могли бы вы предложить предложение о том, как достичь этого? Я пытался разбить первый столбец на массив, получить доступ к последнему элементу, а затем обновить второй столбец.
- Извлеките первые две части каждой линии, используя awk
- Как заменить значения в строке с помощью sed, но сохранить строку неповрежденной
- Удалить символ авторского права
- Нечувствительность к регистру, дублирующая строку, удалите дубликат по выбору случая с самым высоким дублированием
- Как мне grep без пробелов?
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
– это что-то еще, исходное значение сохраняется.