0

次のような3つの列(タブ区切り)の入力データがあります。

  a  mrna_185598_SGL 463
  b  mrna_9210_DLT   463
  c  mrna_9210_IND   463
  d  mrna_9210_INS   463
  e  mrna_9210_SGL   463

sed / awkを使用して、次のような4列のデータに変更するにはどうすればよいですか。

a  mrna_185598 SGL   463
b  mrna_9210   DLT   463
c  mrna_9210   IND   463
d  mrna_9210   INS   463
e  mrna_9210   SGL   463

原則として、元の「mrna」文字列を2つの部分に分割したいと思います。

4

7 に答える 7

2

gawk:

{
  print $1 "\t" gensub(/_/, "\t", 2, $2) "\t" $3
}
于 2010-01-28T03:37:21.133 に答える
2

このようなもの

awk 'BEGIN{FS=OFS="\t"}{split($2,a,"_"); $2=a[1]"_"a[2]"\t"a[3] }1'  file

出力

# ./shell.sh
a       mrna_185598     SGL     463
b       mrna_9210       DLT     463
c       mrna_9210       IND     463
d       mrna_9210       INS     463
e       mrna_9210       SGL     463

Solarisでnawkを使用する

そしてあなたがbashを持っているなら

while IFS=$'\t' read -r a b c
do
    front=${b%_*}
    back=${b##*_}
    printf "$a\t$front\t$back\t$c\n"
done <"file"
于 2010-01-28T03:38:48.613 に答える
1

あなたが投稿したものとあまり変わらないように見えるという条件で:

sed -E 's/mrna_([0-9]+)_/mrna_\1\t/'
于 2010-01-28T03:40:03.960 に答える
1

sedを使用する必要はありません。代わりにtrを使用してください

cat *FILENAME* | tr '_[:upper:]{3}\t' '\t[:lower:]{3}\t' >> *FILEOUT*

cat FILENAMEはファイルを出力し、witchはtr(変換)にパイプ('|')されます。trは、アンダースコアの後に3つの大文字が続き、タブがアンダースコアの代わりにタブになっているものをすべて置き換えます。次に、それをFILEOUTに追加します。

于 2010-01-28T03:49:48.390 に答える
1
$ cat test.txt
  a  mrna_185598_SGL 463
  b  mrna_9210_DLT   463
  c  mrna_9210_IND   463
  d  mrna_9210_INS   463
  e  mrna_9210_SGL   463

$ cat test.txt | sed -E 's/(\S+)_(\S+)\s+(\S+)$/\1\t\2\t\3/'
  a  mrna_185598    SGL 463
  b  mrna_9210  DLT 463
  c  mrna_9210  IND 463
  d  mrna_9210  INS 463
  e  mrna_9210  SGL 463
于 2010-01-28T03:50:35.547 に答える
1
gawk '{$1=$1; $0=gensub(/_/,"\t",2);print}' file

a mrna_185598   SGL 463
b mrna_9210 DLT 463
c mrna_9210 IND 463
d mrna_9210 INS 463
e mrna_9210 SGL 463
于 2019-07-02T00:28:06.957 に答える
0

これはあなたのために働くかもしれません(GNU sed):

sed 's/_/\t/2' file

2番目に出現_するaをタブに置き換えます。

于 2019-07-01T23:20:03.043 に答える