简体   繁体   中英

reverese order of strings except first word in bash

I'm trying to reverse the order of words excluding first word in final output. For example, I have a word db.in.com.example I'm using this command to reverse the order

$ basename db.in.com.example | awk -F'.' '{ for (i=NF; i>1; i--) \
printf("%s.",$i); print $1; }'
example.com.in.db

I want to exclude last .db in the output. Like this

example.com.in

I'm having trouble with this. Can this be done using only awk ? Can anybody help me on this ?

$ echo db.in.com.example | awk -F. '{      # set . as delimiter
    for(i=NF;i>1;i--)                      # loop from last to next-to-first
        printf "%s%s", $i, (i==2?ORS:".")  # output item and ORS or . after next-to-first
}'
example.com.in

If perl is okay

$ echo 'db.in.com.example' | perl -F'\.' -lane 'print join ".", reverse(@F[1..$#F])'
example.com.in
$ echo '1.2.3.db.in.com.example' | perl -F'\.' -lane 'print join ".", reverse(@F[2..$#F])'
example.com.in.db.3
  • -F'\\.' set . as input field separator and save to @F array
  • reverse(@F[1..$#F]) will give reversed array of elements from index 1 to last index
    • similarly, @F[2..$#F] will exclude first and second element
  • join "." to add . as separator between elements of array
  • See http://perldoc.perl.org/perlrun.html#Command-Switches for details on command line options

You can use cut , tac , and parameter expansion:

reverse=$(basename db.in.com.example |
    cut -d. -f2- --output-delimiter=$'\n' |
    tac )
echo ${reverse//$'\n'/.}

You've got some nice answers here. I am adding one which in my opinion is more readable, of course if ruby is an option for you:

$ echo "db.in.com.example" | ruby -ne 'p ($_.strip.split(".").drop(1).reverse.join("."))' 
"example.com.in"

try following too once, which will reverse the text and it allows you to remove any string from output not only db, you need to just change the variable's value and it should fly then.

echo "db.in.com.example" | awk -v var="db" -F"." '{for(i=NF;i>0;i--){val=$i!=var?(val?val FS $i:$i):val};print val;val=""}'

EDIT: Adding a non-one liner form of solution too now.

echo "db.in.com.example" | awk -v var="db" -F"." '{
  for(i=NF;i>0;i--){
  val=$i!=var?(val?val FS $i:$i):val
  }
  print val;val=""
}'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM