Chinaunix首页 | 论坛 | 博客
  • 博客访问: 499703
  • 博文数量: 401
  • 博客积分: 244
  • 博客等级: 入伍新兵
  • 技术积分: 2215
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-04 10:02
文章分类

全部博文(401)

文章存档

2013年(37)

2012年(364)

分类:

2012-08-16 15:17:19


在论坛经常看到有人问行列转换,倒序,反转字符串等等.今天一并放出

行列转换,这个算是自己一步一步写出来的,过程也放出来了.
zj@zj:~/Script/cushell/08.11.03$ cat rotate1.sh
#/bin/bash


if [ $# -ne 1 ]

then
    echo "Usage:rotate urfile"
    exit 1
fi

if [ ! -s $1 ]
then
    echo "Usage:rotate urfile"
        exit 1
fi

row=$(sed -n '$=' $1)
col=$(awk 'NR==1{print NF}' $1)
awk -v row=$row -v col=$col '{ for(i=1;i<=NF;i++)a[NR"-"i]=$i }END{ for(i=1;i<=col;i++){ for(j=1;j<=row;j++) printf("%s ",a[j"-"i]);print ""} }' $1
zj@zj:~/Script/cushell/08.11.03$ cat rotate.data
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

zj@zj:~/Script/cushell/08.11.03$ ./rotate1.sh rotate.data
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
这个脚本其实挺简单的,不过对输入有需求,就是输入的列数是一样的.或者第一行的列数是最多的.改下
把col=$(awk 'NR==1{print NF}' $1)改为col=$(awk -v cols=0 '{if(NF>cols)cols=NF}END{print cols}' $1)
这样的话,还有个问题就是a[j"-"i]没有值的时候什么都不打印,这样就不能对齐了.
大概就是这个样子
j@zj:~/Script/cushell/08.11.03$ ./rotate1.sh rotate.data
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
 5 5 5 5
  6
这个时候先对不存在的a[j"-"i]赋个空值就可以了
for(j=1;j<=row;j++){if(!a[j"-"i])a[j"-"i]=" ";printf("%s ",a[j" -"i])}
zj@zj:~/Script/cushell/08.11.03$ ./rotate1.sh rotate.data
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
  5 5 5 5
    6


下面这个是烈火兄弟的挺有创意的,你们自己慢慢琢磨去.问题肯定也是有滴^_^
zj@zj:~/Script/cushell/08.11.03$ cat rotate2.sh
#!/bin/bash

n=1
m=$(awk 'NR==1{print NF}' $1)
while (( n<=m ))
do
    cut -f$n -d ' ' $1 | tr '\n' ' ' ;echo
    (( n++ ))
done

zj@zj:~/Script/cushell/08.11.03$ cat rotate.data
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

zj@zj:~/Script/cushell/08.11.03$ ./rotate2.sh rotate.data
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5

OK行列转换就说到这里了.

至于倒序的话,用sed的话是sed '1!G;h;$! d',不过直接tac就是cat反着写就可以了,我现在是习惯tac了

至于反转字符串rev就可以了,你要是BT的话awk可以简单实现,就是先求出字符串总长度(length),然后substr($0,i,1)每次取一个
不懂跟贴,不过我说道这份上了,你要是还不会那... 先撞下墙再问把^_^ just a joke.
 

阅读(1932) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~