hualnux QA 1.3:如果用shell脚本实现多行逐一纵向输出

一、需求

上图中有一个密码子表,为了方便我把上图表中内容用文字方式拿出来,并命名为hua.txt,如下:

FFLLSSSSYY**CC**LLLPPHHQQRRRIMTTTTNNKKSSRRVWVVAAAADDEEGGGG
TTTTTTTTTTTTTTCCCCCCCCCCCAAAAAAAAAAAAGGGGGGGGGGGGGGG
TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG
TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG

二、分析

其实这就是一个多行逐一以纵向的方式输出,只不是行之间多了一个空格。

如果要把行变成纵向读的话,那我是不是可以把第行的字对应纵向拼出来就行了,思路如下:

1.上面有4行我们可以拿4个变量去存,分别为str1、str2、str3、str4

这个功能不难实现用sed就可以取指定某行的值

2.我们再把str1第1个字符  空格 str2第1个字符 空格 str3第1个字符 空格 str4第1个字符,同理按顺序读第2个,第3个,第n个,可以用循环的方式输出即可,首先需要解决2个问题

  1. 第个字符的长度是怎决定,既然要输出所有字符,为了简单点,直接用最长字符长度如str3和str4为准,取字符长度保可以使用${#str3}
  2. 如何一个一个输出字符串的字符呢?grep、awk、sed都没有更细粒度的,cut命令可以做到

        -c:仅显示行中指定范围的字符;比如你截第一个1字符可以 cut -c 1

把上面的2个思路连起来,就可以实现了

三、解决

hua.txt和脚本内容如下:

[root@vm81 t1]# cat hua.txt 
FFLLSSSSYY**CC**LLLPPHHQQRRRIMTTTTNNKKSSRRVWVVAAAADDEEGGGG
TTTTTTTTTTTTTTCCCCCCCCCCCAAAAAAAAAAAAGGGGGGGGGGGGGGG
TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG
TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG
[root@vm81 t1]# 
[root@vm81 t1]# cat line2row.sh 
#!/bin/bash
str1=`sed -n 1p $1`
str2=`sed -n 2p $1`
str3=`sed -n 3p $1`
str4=`sed -n 4p $1`

for(( i=1;i<=${#str3};i++))
do 
   new=$(echo $str1|cut -c $i)' '$(echo $str2|cut -c $i)' '$(echo $str3|cut -c $i)' '$(echo $str4|cut -c $i)
   echo "$new"
done

执行效果如下:

[root@vm81 t1]# sh line2row.sh hua.txt 
F T T T
F T T C
L T T A
L T T G
S T C T
S T C C
S T C A
S T C G
Y T A T
Y T A C
* T A A
* T A G
C T G T
C T G C
* C G A
* C G G
L C T T
L C T C
L C T A
P C T G
P C C T
H C C C
H C C A
Q C C G
Q C A T
R A A C
R A A A
R A A G
I A G T
M A G C
T A G A
T A G G
T A T T
T A T C
N A T A
N A T G
K A C T
K G C C
S G C A
S G C G
R G A T
R G A C
V G A A
W G A G
V G G T
V G G C
A G G A
A G G G
A G T T
A G T C
D G T A
D G T G
E  C T
E  C C
G  C A
G  C G
G  A T
G  A C
  A A
  A G
  G T
  G C
  G A
  G G

发现最后几个不对齐,不美观,改用printf输出美化一下,修改一下源代码,如下:

#!/bin/bash
str1=`sed -n 1p $1`
str2=`sed -n 2p $1`
str3=`sed -n 3p $1`
str4=`sed -n 4p $1`

for(( i=1;i<=${#str3};i++))
do 
   printf "%-1s %-1s %-1s %-1s\n" "$(echo $str1|cut -c $i)" "$(echo $str2|cut -c $i)" "$(echo $str3|cut -c $i)" "$(echo $str4|cut -c $i)"
done

printf中:

%s %c %d %f都是格式替代符

%-ns,n为数字 指一个宽度为n个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在n个字符宽的字符内,如果不足则自动以空格填充, 

效果如下:

[root@vm81 t1]# sh line2row.sh  hua.txt 
F T T T
F T T C
L T T A
L T T G
S T C T
S T C C
S T C A
S T C G
Y T A T
Y T A C
* T A A
* T A G
C T G T
C T G C
* C G A
* C G G
L C T T
L C T C
L C T A
P C T G
P C C T
H C C C
H C C A
Q C C G
Q C A T
R A A C
R A A A
R A A G
I A G T
M A G C
T A G A
T A G G
T A T T
T A T C
N A T A
N A T G
K A C T
K G C C
S G C A
S G C G
R G A T
R G A C
V G A A
W G A G
V G G T
V G G C
A G G A
A G G G
A G T T
A G T C
D G T A
D G T G
E   C T
E   C C
G   C A
G   C G
G   A T
G   A C
    A A
    A G
    G T
    G C
    G A
    G G

 是不是美化了,对齐了^_^

猜你喜欢

转载自blog.csdn.net/hualinux/article/details/106659656
QA