如果第一个较大,请在file.txt中更改线条图案

时间:2019-01-11 20:31:25

标签: bash

大家好,我实际上有一个file.txt,其中包含很多行,例如:

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 5000-3000 >> file.fst

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 1-500 >> file.fst

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 6000-2000 >> file.fst

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 340-670 >> file.fst

您有时会在-range部分看到,第一个数字大于第二个,而第一个数字较小。 我希望当第一个数字大于第二个数字时,通过互换来更改行。 例如:

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 3000-5000 >> file.fst

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 1-500 >> file.fst

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 2000-6000 >> file.fst

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 340-670 >> file.fst

您认为有可能吗? 非常感谢。

3 个答案:

答案 0 :(得分:2)

使用GNU awk:

awk '{split($(NF-2),array,"-"); if(array[1]>array[2]){$(NF-2)=array[2] "-" array[1]}; print}' file

使用$(NF-2)将倒数第二个元素(split())拆分为一个数组,比较其元素,然后重新组装倒数第二个元素($(NF-2)=array[2] "-" array[1])。

输出:

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 3000-5000 >> file.fst
blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 1-500 >> file.fst
blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 2000-6000 >> file.fst
blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 340-670 >> file.fst

请参阅:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

答案 1 :(得分:2)

perl:

perl -pe 's/(?<=-range )(\d+)-(\d+)/ ($a,$b) = $1 < $2 ? ($1,$2) : ($2,$1); "$a-$b" /e' file.txt

答案 2 :(得分:1)

当然可以。这是一个快速的解决方案。根据需要/上下文,它可以变得更强大:

so2.sh

#!/bin/bash

while read linein; do
    #echo $linein            ## uncomment for debugging

    rangeA=`echo $linein | sed 's/^.* -range \([0-9]*\).*$/\1/'`
    rangeB=`echo $linein | sed 's/^.* -range [0-9]*-\([0-9]*\).*$/\1/'`
    #echo $rangeA $rangeB    ## uncomment for debugging

    if [[ $rangeA -gt $rangeB ]]; then
        echo "blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range ${rangeB}-${rangeA} >> file.fst"
    else
        echo "blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range ${rangeA}-${rangeB} >> file.fst"
    fi
done < so2.in

so2.in

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 5000-3000 >> file.fst
blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 1-500 >> file.fst
blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 6000-2000 >> file.fst
blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 340-670 >> file.fst

./so2.sh

blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 3000-5000 >> file.fst
blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 1-500 >> file.fst
blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 2000-6000 >> file.fst
blastdbcmd -db path/db_ui/ode -entry scaffold_XXX -range 340-670 >> file.fst