加载中…
个人资料
linzhao[5662]
linzhao[5662]
  • 博客等级:
  • 博客积分:0
  • 博客访问:11,094
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

LINUX SHELL 行列转换、倒序

(2009-12-03 18:10:51)
标签:

杂谈

分类: LINUX-SHELL

==============================================================================

这部分为【转】:http://blog.chinaunix.net/u2/76292/showart_1359777.html

1.行列转换:

#/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

 

或者:

#!/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

 

2.倒序

a. sed '1!G;h;$! d'

b. tac,就是cat反着写

==============================================================================

 

这部分为【后记】:

使用时发现,只能处理小文件,当数据文件较大,如300M,上面程序出错。只得新写。

重写了个比较笨拙的行列转换程序,效率一般,关键是大数据文件没有问题。

 #! /bin/sh

F=$1

m=`wc -l ${F} | awk '{print $1}'`

awk '{for(i=1;i<=NF;i++){print $i >> NR".rs"}}' ${F}
while [ ${m} -gt 0 ]
do
        if [ -f "${m}.rs" ];then
                paste -d'       ' ${m}.rs totresult > totresult.tmp
                m=`expr ${m} - 1`
                mv totresult.tmp totresult
        fi
done

 -----------------------------------------------------------------------------------------

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有