2010-01-28 71 views
0

我有三列(製表符分隔)像這樣的輸入數據:修改文本列明智的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 

如何使用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」字符串拆分爲2部分。

回答

2

像Solaris上

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 

使用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

GAWK:

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

只要他們不看從你貼什麼太多的不同:

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

無需輸入重定向。 – ghostdog74 2010-01-28 03:42:20

1

你不需要使用SED。而是使用TR

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

FILENAME將打印出來的文件,巫然後將管道( '|')到TR(翻譯)。 tr將替換任何具有下劃線後跟3個大寫字母,然後是帶有選項卡而不是下劃線的選項卡。然後它會將其附加到FILEOUT

+1

沒用的貓用。將文件傳遞給tr。 - 。 tr'blah'blah'> fileout。你是否正確地測試了你的命令? – ghostdog74 2010-01-28 03:53:33

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 
+1

沒用的貓用。改爲將文件名傳遞給sed。 - 'sed'選項'文件名' – ghostdog74 2010-01-28 03:54:02