Split a string by awk and print everything but the last two splits [closed]

删除回忆录丶 提交于 2020-02-05 02:11:11

问题


I have a string /home/lamma/local-blast/termitomycesBGI/short_reads/F19FTSEUHT1394.IC0035-2A_1.fq.gz and I am using awk to split the string:

echo  /home/lamma/local-blast/termitomycesBGI/short_reads/F19FTSEUHT1394.IC0035-2A.fasta.gz | awk -F'.[^.]*$' '{ print $1 }'

Which returns:

/home/lamma/local-blast/termitomycesBGI/short_reads/F19FTSEUHT1394.IC0035-2A.fasta

But want it to return:

/home/lamma/local-blast/termitomycesBGI/short_reads/F19FTSEUHT1394.IC0035-2A

How do I do this?


回答1:


Split a string by awk and print everything but the last two splits

You may use this awk:

awk 'BEGIN{FS=OFS="."} {$NF=$(NF-1)=""; NF-=2} 1' <<< '/home/lamma/local-blast/termitomycesBGI/short_reads/F19FTSEUHT1394.IC0035-2A.fasta.gz'

/home/lamma/local-blast/termitomycesBGI/short_reads/F19FTSEUHT1394.IC0035-2A



回答2:


Could you please try following. You could use Parameter expansion of bash.

val="/home/lamma/local-blast/termitomycesBGI/short_reads/F19FTSEUHT1394.IC0035-2A.fq.gz"
echo "${val%_*}"

Output will be as follows.

/home/lamma/local-blast/termitomycesBGI/short_reads/F19FTSEUHT1394.IC0035-2A


EDIT: As per anubhava sir's comments, in case variable has . itself then try following using rev + awk solution.

echo "$val" | rev | awk 'BEGIN{FS=OFS="."} {$1=$2="";sub(/^\.+/,"");print $0}' | rev


EDIT2: Adding a sed + rev solution.

echo "$val" | rev | sed 's/[^.]*.[^.]*.\(.*\)/\1/' | rev


来源:https://stackoverflow.com/questions/59773339/split-a-string-by-awk-and-print-everything-but-the-last-two-splits

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!