2017-07-06 5 views
1

私は値の行を持つファイルを持っています。最初の列PacBio読み取りIDは、スラッシュで区切られた値です。私は、最後のスラッシュとそれを超える値を削除して列を変更したいと思います。理想的には結果はストリーム可能(sed/awkなど)で、スラッシュの数に依存しません(つまり、スラッシュが1つでも3つでも解決します)。sed/awkを使用して、区切り文字列の最後の部分を削除します。

# example row 
m54151_170617_100137/4194626/10117_11723/0_1606 1257 1606 

# desired row 
m54151_170617_100137/4194626/10117_11723 1257 1606 
+0

がそれらをですあなたの値か別のものの間のタブ? –

+0

@エモートンはタブです – zach

答えて

1

ショートSEDソリューション:

sed 's~/[^/[:space:]]* ~ ~' file 

出力例:

m54151_170617_100137/4194626/10117_11723 1257 1606 

  • ~ - あなたが潜在的に自分のフィールドにスペースを持っている場合サブコマンドの区切り
+0

シンプルで効果的でわかりやすい。ありがとう。 – zach

+0

@zach、ありがとうございます。 – RomanPerekhrest

2

あなたは少しの空白を変更する気にしない場合:

awk '{sub("/[^/]*$","",$1)}1' input 

空白事項の場合:

sed '[email protected]^\([^ ]*\)/[^ /]* @\1 @' input 
+0

すばらしい答えです。私はローマに小切手をくれましたが、もう少し理解できると思います。 – zach

1

をsedのものとして扱わ、 /を使用して分割します。あなたが最後のフィールド印刷/をフィールドに再び参加し、/に分割することができますawkので

$ awk -F'/' '{s="" 
      for (i=1;i<NF;i++) 
       s=s ? s FS $i : $i 
       print s $NF}' file 

同じではRubyで少し楽です:

$ ruby -F'/' -lane 'puts $F[0...-1].join("/")<<$F[-1]' file 
0
awk '{print substr($1,1,40),$2,$3}' OFS="\t" file 

m54151_170617_100137/4194626/10117_11723 1257 1606 
+0

ありがとうございます。しかし、この解決策では、部分文字列の長さがわかっているので、一般的ではありません。 – zach

関連する問題