在论坛经常看到有人问行列转换,倒序,反转字符串等等.今天一并放出
行列转换,这个算是自己一步一步写出来的,过程也放出来了.
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.
|