python中英文古风排版_hualnux QA 1.3:如果用shell脚本实现多行逐一纵向输出

本文介绍如何使用shell脚本将多行文本逐一纵向输出,通过示例展示了利用sed、cut命令和printf进行字符操作的过程,最终实现美观的对齐效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、需求

a0ea260dfea91f5bb9cb63bba80af740.png

上图中有一个密码子表,为了方便我把上图表中内容用文字方式拿出来,并命名为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个问题

第个字符的长度是怎决定,既然要输出所有字符,为了简单点,直接用最长字符长度如str3和str4为准,取字符长度保可以使用${#str3}

如何一个一个输出字符串的字符呢?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

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

80ae8024fd09dd7e710dc2dcd216e21c.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值