使用sed / awk修改文本列

时间:2010-01-28 03:30:58

标签: linux unix sed awk text-processing

我有一个包含三列(制表符分隔)的输入数据,如下所示:

  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将其修改为 四列数据如下所示:

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”字符串分成两部分。

7 个答案:

答案 0 :(得分:2)

GAWK:

{
  print $1 "\t" gensub(/_/, "\t", 2, $2) "\t" $3
}

答案 1 :(得分: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"

答案 2 :(得分:1)

如果它们与您发布的内容没有太大差异,那么

sed -E 's/mrna_([0-9]+)_/mrna_\1\t/'

答案 3 :(得分:1)

你不需要使用sed。而是使用tr

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

cat FILENAME 将打印出文件,然后通过管道传输('|')到tr(翻译)。 tr将替换任何具有下划线后跟3个大写字符的内容,然后替换带有选项卡而不是下划线的选项卡。然后它会将它附加到 FILEOUT

答案 4 :(得分: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

答案 5 :(得分: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

答案 6 :(得分:0)

这可能对您有用(GNU sed):

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

通过制表符替换第二次出现的_