как заменить конкретные цифры вместо определенных номеров - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть такой текстовый файл

ID  
MQ2427D17-01_1_12
MQ2427D17-01_1_1
MQ2427D17-01_1_2
MQ2427D17-01_1_3
MQ2427D17-01_1_4
MQ2427D17-02_2_5
MQ2427D17-02_2_25
MQ2427D17-02_2_1
MQ2427D17-02_2_2
MQ2427D17-02_2_3
MQ2427D17-02_2_4
MQ2427D17-01_1_28
MQ3427D17-01_1_29
MQ3427D17-01_1_1
MQ3427D17-01_1_2
MQ3427D17-01_3_3
MQ3427D17-01_3_30
MQ3427D17-01_3_33

Я хочу изменить цифры в конце, когда они от 1 до 13, от 2 до 14, от 3 до 15, всякий раз, когдаэто от 4 до 16, когда от 5 до 17, от 6 до 18, от 7 до 19 ... когда от 12 до 24.

, поэтому результат выглядит следующим образом

ID  
MQ2427D17-01_1_24
MQ2427D17-01_1_13
MQ2427D17-01_1_14
MQ2427D17-01_1_15
MQ2427D17-01_1_16
MQ2427D17-02_2_17
MQ2427D17-02_2_25
MQ2427D17-02_2_13
MQ2427D17-02_2_14
MQ2427D17-02_2_15
MQ2427D17-02_2_16
MQ2427D17-01_1_28
MQ3427D17-01_1_29
MQ3427D17-01_1_13
MQ3427D17-01_1_14
MQ3427D17-01_3_15
MQ3427D17-01_3_30
MQ3427D17-01_3_33

Я пытался сделать это с этим

sed 's/1/13/g' myfile.txt > modified.txt

sed = Stream EDitor
The command string:
s = the substitute command
original = a regular expression describing the number to replace
g = global (i.e. replace all and not just the first occurrence)
myfile.txt = mydata
modified.txt = the output

, но это изменит число, где бы они ни были

Я не знаю, почему решение нижене работает, например, на этом примере данные

ID
MQ3HHD2D17-01_1_1
MQ3HHD2D17-01_1_2
MQ3HHD2D17-01_1_3
MQ3HHD2D17-01_1_4
MQ3HHD2D17-01_1_5
MQ3HHD2D17-01_1_6
MQ3HHD2D17-01_1_7
MQ3HHD2D17-01_1_8
MQ3HHD2D17-01_1_9
MQ3HHD2D17-01_1_10
MQ3HHD2D17-01_1_11
MQ3HHD2D17-01_1_12
MQ4HHD2D17-01_2_1
MQ4HHD2D17-01_2_2
MQ4HHD2D17-01_2_3
MQ4HHD2D17-01_2_4
MQ4HHD2D17-01_2_5
MQ4HHD2D17-01_2_6
MQ4HHD2D17-01_2_7
MQ4HHD2D17-01_2_8
MQ4HHD2D17-01_2_9
MQ4HHD2D17-01_2_10
MQ4HHD2D17-01_2_11
MQ4HHD2D17-01_2_12

Это должно быть

 ID
 MQ3HHD2D17-01_1_13
 MQ3HHD2D17-01_1_14
 MQ3HHD2D17-01_1_15
 MQ3HHD2D17-01_1_16
 MQ3HHD2D17-01_1_17
 MQ3HHD2D17-01_1_18
 MQ3HHD2D17-01_1_19
 MQ3HHD2D17-01_1_20
 MQ3HHD2D17-01_1_21
 MQ3HHD2D17-01_1_22
 MQ3HHD2D17-01_1_23
 MQ3HHD2D17-01_1_24
 MQ4HHD2D17-01_2_13
 MQ4HHD2D17-01_2_14
 MQ4HHD2D17-01_2_15
 MQ4HHD2D17-01_2_16
 MQ4HHD2D17-01_2_17
 MQ4HHD2D17-01_2_18
 MQ4HHD2D17-01_2_19
 MQ4HHD2D17-01_2_20
 MQ4HHD2D17-01_2_21
 MQ4HHD2D17-01_2_22
 MQ4HHD2D17-01_2_23
 MQ4HHD2D17-01_2_24

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

Не могли бы вы попробовать следующее.

awk 'BEGIN{FS=OFS="_"} $NF>=1 && $NF<=12{$NF+=12} 1' Input_file

ИЛИ

awk 'BEGIN{FS=OFS="_"} {gsub(/\r/,"")} $NF>=1 && $NF<=12{$NF+=12} 1' Input_file

ИЛИ

tr -d '\r' < Input_file > temp && mv temp Input_file
awk 'BEGIN{FS=OFS="_"} $NF>=1 && $NF<=12{$NF+=12} 1' Input_file

После устранения неполадок с пользователем в чате, стало известно, что у OP есть контрольные символы M (которые OP не хочет иметь), поэтому посоветовал OP удалить их, выполнив tr -d '\r' < Input_file > temp && mv temp Input_file изатем запустите вышеуказанный код.

0 голосов
/ 04 февраля 2019

Типовое решение с использованием однострочного Perl

perl -pe ' s/(\d+)$/$1<13?$1+12:$1/ge '

со входами.

$ perl -pe ' s/(\d+)$/ $1<13 ? $1+12 : $1/ge ' learner.txt
ID
MQ2427D17-01_1_24
MQ2427D17-01_1_13
MQ2427D17-01_1_14
MQ2427D17-01_1_15
MQ2427D17-01_1_16
MQ2427D17-02_2_17
MQ2427D17-02_2_25
MQ2427D17-02_2_13
MQ2427D17-02_2_14
MQ2427D17-02_2_15
MQ2427D17-02_2_16
MQ2427D17-01_1_28
MQ3427D17-01_1_29
MQ3427D17-01_1_13
MQ3427D17-01_1_14
MQ3427D17-01_3_15
MQ3427D17-01_3_30
MQ3427D17-01_3_33

$
0 голосов
/ 02 февраля 2019

Из вашего описания мы можем наблюдать закономерность: добавление 12 к конечным числам, если конечные числа меньше 12. (Здесь конечные числа относятся к числам после последнего подчеркивания.)

awk может выполнить эту задачу.

awk -F_ -v OFS=_ '{if($NF <= 12) $NF += 12;}1' myfile.txt >modified.txt

Флаги:

  • -F_: ограничитель ввода равен _
  • -v OFS=_: одна из специальных переменных awk, обозначающая O utput F ile S эператор (он же выходной разделитель)

Другие:

  • NF: еще одна из специальных переменных awk, обозначающая N число F ields
  • $NF: эта переменная будет содержать последнее поле.
  • {...}1: 1 в конце указывает awk напечатать все.

Лично я бы не рекомендовал использовать sed, так как вам нужно заменить 1 на 13, 2 на 14, 3 на 15, (и так далее) по отдельности.Это делает его утомительным кандидатом в руки.С другой стороны, awk может выполнять базовые математические вычисления (такие как +12, как вы видели), все еще имея возможность анализировать ввод.

Вывод:

ID
MQ2427D17-01_1_24
MQ2427D17-01_1_13
MQ2427D17-01_1_14
MQ2427D17-01_1_15
MQ2427D17-01_1_16
MQ2427D17-02_2_17
MQ2427D17-02_2_25
MQ2427D17-02_2_13
MQ2427D17-02_2_14
MQ2427D17-02_2_15
MQ2427D17-02_2_16
MQ2427D17-01_1_28
MQ3427D17-01_1_29
MQ3427D17-01_1_13
MQ3427D17-01_1_14
MQ3427D17-01_3_15
MQ3427D17-01_3_30
MQ3427D17-01_3_33
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...