我有一个包含三列(制表符分隔)的输入数据,如下所示:
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”字符串分成两部分。
答案 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)
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
通过制表符替换第二次出现的_
。