2017-02-08 7 views
0

У меня есть файл результата, значения которого разделены ;, как указано ниже:Заменить строку после первой точки с запятой, сохраняя после этого строку

137; AJP14028.1_VP35; HLA-A * 02: 01; MVAKYDFLV; 0,79200; 0,35000; 0,877783; 0,99826; 0,30; <-E
137; AJP14037.1_VP35; HLA-A * 02: 01; MVAKYDFLV; 0,79200; 0,35000; 0,877783; 0,99826; 0,30; <-E
137; AJP14352.1_VP35; HLA-A * 02: 01; MVAKYDFLV; 0,79200; 0,35000; 0,877783; 0,99826; 0,30; <-E
137; AJP14846.1_VP35; HLA-A * 02: 01; MVAKYDFLV; 0,79200; 0,35000; 0,87783; 0,99826; 0,30; < -E

, и я хочу изменить второе значение (AJP14028.1_VP35) только AJP14028, без».1_VP35" на спине. Таким образом, результат будет следующим:

137; AJP14028; HLA-A * 02: 01; MVAKYDFLV; 0,79200; 0,35000; 0,87773; 0,99826; 0,30; <-E
137; AJP14037; HLA-A * 02: 01; MVAKYDFLV; 0,79200; 0,35000; 0,87783; 0,99826; 0,30; <-E
137; AJP14352; HLA-A * 02: 01; MVAKYDFLV; 0,79200; 0,35000; 0,877783; 0,99826; 0,30; <-E
137; AJP14846; HLA-A * 02: 01; MVAKYDFLV; 0,79200; 0,35000; 0,877783; 0,99826; 0,30; < -E

Любая идея о том, как это сделать? Я пытаюсь решить это, используя либо sed, либо awk, но я пока не знаком с ними.

+0

Это часть, которую вы хотите удалить всегда '.1_VP35', или может быть другой (например,' .1_VP36')? Если первая, будет ли строка '.1_VP35' появляться в другом месте, где вы не хотите ее удалить? –

+0

@ Jordan это могут быть некоторые другие строки, например. '.1_mino',' .1_poly' и т. Д., '.1_VP35' происходит только при втором значении –

ответ

2

С этим входом, и фокусировка на втором поле, вы можете использовать awk:

$ awk 'BEGIN{FS=OFS=";"} {split($2, arr, /\.1/); $2=arr[1]} 1' file 
137;AJP14028;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 
137;AJP14037;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 
137;AJP14352;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 
137;AJP14846;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 

Объяснение:

  1. BEGIN{FS=OFS=";"} наборы FS и OFS в ";". Это разбивает вход на символ ; и устанавливает разделитель выходного поля на тот же символ.
  2. {split($2, arr, /\.1/) разделяет второе поле по шаблону буквального .1 и помещает результат в массив.
  3. $2=arr[1] - это awk идиома, которая сбрасывает второе поле, $2, до обрезанного значения. Побочным эффектом является общая запись, $0 сбрасывается с использованием разделителя выходного поля, OFS
  4. 1 В конце есть еще один awkism - распечатать текущую запись.

Если вы просто иметь фиксированную строку .1_VP35 для удаления (и не волнует, если это поле конкретных), вы можете просто использовали sed:

sed 's/\.1_VP35//' file 
+0

за вашу помощь! Но что означает «раскол ($ 2, arr, /\.1/)»? –

+0

Пояснение добавлено. – dawg

1
awk '{sub(/.1_VP35/,"")}1' file 

137;AJP14028;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 
137;AJP14037;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 
137;AJP14352;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 
137;AJP14846;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 
0
sed -r 's/(^[^.]*)(.[^;]*)(.*)/\1\3/g' inputfile 
137;AJP14028;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 
137;AJP14037;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 
137;AJP14352;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 
137;AJP14846;HLA-A*02:01;MVAKYDFLV;0.79200;0.35000;0.87783;0.99826;0.30;<-E 

Здесь: back referencing используется для разделения входной строки на три группы, разделенные символом `() '. Позже они называются «\ 1» и так далее.

Первая группа будет соответствовать началу линии до первой точки. Вторая группа будет соответствовать строке, за которой следует первая точка до первой точки с запятой. Третья группа будет соответствовать всему, что следует за ней.

0

Это может работать для вас (GNU СЭД):

sed 's/\(;[^.]*\)[^;]*/\1/' file 

Сделать обратную ссылку первого ; и все, после которых не ., а затем удалить все из на них, который не является ;.