Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69399
  • 博文数量: 51
  • 博客积分: 141
  • 博客等级: 入伍新兵
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 15:50
文章分类

全部博文(51)

文章存档

2012年(51)

最近访客

分类:

2012-03-05 22:35:13

交叉存储文件shell实现

题目:要求使用shell实现两个文本的交叉存储,即先存储第一个文本的第一行,然后是第二个文本的第一行,如此交替,分别实现两个文本行数相同和行数不同的情况。

 

解题思路:(1)利用exec为文件建立相应的文件描述符,通过文件描述符读写,利用while的特性

while read line1

do

done < $1

可以循环读取文件里面的内容。

2)直接利用exec为文件建立相应的文件描述符,函数store3即是这种方法,为两个输入文件都建立了文件描述符来进行处理。

 

脚本清单:

#! /bin/bash

 

#定义函数

declare -f store1

declare -f store2

declare -f store3

 

#定义一个整型

declare -i flag

 

flag=0

 

function store1()

{

#以文件描述符5打开文件$2

         exec 5<$2

#复制文件描述符5到文件描述符1

#       exec 1<&5

         while read line1

         do

                   read line2 <&5

                   echo $line1 >> $3

                   echo $line2 >> $3

         done < $1

 

}

 

function store2()

{

#以文件描述符5打开文件$2

         exec 5<$2

#复制文件描述符5到文件描述符1

#       exec 0<&5

         while read line1

         do

                   if [ $flag -eq "0" ]; then

                            read line2 <&5

                   fi

                   echo $line1 >> $3

                   if [ -n "$line2" ]; then

                            echo $line2 >> $3

                   else

                            flag=1

                   fi

         done < $1

         while read line2 <&5

         do

                   echo $line2 >> $3

         done

 

}

 

function store3()

{

         exec 3<$1

         exec 4<$2

        

         while true

         do

                   read line1 <&3

                   read line2 <&4

                   #测试的时候为啥必须要加上双引号

                   if [ -n "$line1" ]; then

                            echo $line1 >>$3

                            if [ -n "$line2" ]; then

                                     echo $line2 >>$3

                            else

                                     while read line1 <&3

                                     do

                                               echo $line1 >> $3

                                     done

                                     break

                            fi

                   else

                            if [ -n "$line2" ]; then

                                     while read line2 <&4

                                     do

                                               echo $line2 >> $3

                                     done

                                     break

                            else

                                      break

                            fi

                   fi

                           

         done

         exec 3<&-

         exec 4<&-

 

}

 

set -x

store3 "$@"

 

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