问题
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