2017-02-08 62 views
0

我有一個結果文件,值之間用分隔;如下:在第一個分號後替換字符串,同時保留字符串

137; HLA-A * 02:01; MVAKYDFLV; 0.79200; 0.35000; 0.87783; 0.99826; 0.30;以及其中, < -E
137; HLA-A * 02:01; MVAKYDFLV; 0.79200; 0.35000; 0.87783; 0.99826; 0.30;以及其中, < -E
137; HLA-A * 02:01; MVAKYDFLV; 0.79200; 0.35000; 0.87783; 0.99826; 0.30;以及其中, < -E
137; HLA-A * 02:01; MVAKYDFLV; 0.79200; 0.35000; 0.87783; 0.99826; 0.30; < -E

,我想第二個值(AJP14028.1_VP35)更改爲只AJP14028,沒有」 .1_VP35" 在後面。所以結果如下:

137; HLA-A * 02:01; MVAKYDFLV; 0.79200; 0.35000; 0.87783; 0.99826; 0.30; < -E
137; HLA-A * 02:01; MVAKYDFLV; 0.79200; 0.35000; 0.87783; 0.99826; 0.30; < -E
137; HLA-A * 02:01; MVAKYDFLV; 0.79200; 0.35000; 0.87783; 0.99826; 0.30; < -E
137; HLA-A * 02:01; MVAKYDFLV; 0.79200; 0.35000; 0.87783; 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):

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

使第一;的背面參考,一切之後是不是.,然後刪除一切從上面這不是;

相關問題