大家好,我实际上有一个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
您认为有可能吗? 非常感谢。
答案 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