LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2360|回复: 17

如何同时对2个文件进行操作

[复制链接]
发表于 2008-2-22 15:49:53 | 显示全部楼层 |阅读模式
我只知道用while对单个文件读取操作
不知道怎么同时用2个文件
发表于 2008-2-22 19:53:16 | 显示全部楼层
先归并啊,可以
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-23 18:07:05 | 显示全部楼层
说的再具体一点
文件a
aa1
aa2
aa3

文件b
bb1
bb2
bb3

现在我想从shell中读一行a文件读一行b文件
然后做mv aa1 bb1的操作
因为之前用shell对文件操作都是对单个文件的,没有对多个文件操作过

后来自己的做法是
cat -n a>a.bak
cat -n b> b.bak
join a.bak b.bak > all
sed -i  's/^[0-9]*/mv/g' all
sh all
不过感觉这样不太好  最好是在shell循环读文件能同时读2个文件  一一对应的来做
回复 支持 反对

使用道具 举报

发表于 2008-2-23 19:11:25 | 显示全部楼层
两个read不就ok了,相当于两个open吧,然后再按照行处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-23 19:18:12 | 显示全部楼层
我一般是这样用的

while read filea
do
        while read fileb
        do
             $filea $fileb
        done<b
done<a

我要的是一行a文件  一行b文件  
我这样做循环的话  a文件一行要读完b文件不对
回复 支持 反对

使用道具 举报

发表于 2008-2-23 21:09:20 | 显示全部楼层
可不可以这样呢,大的循环用while来做,读a文件,read后面用awk/sed来处理b文件的指定行,把他的结果提取出来就是。这样就在一个循环中做了阿。就是需要给awk/sed传个指定的行参数。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-23 22:33:06 | 显示全部楼层
你说的这个方法也行  不过效率太低 一次循环就要用awk sed一次

不知道shell本身有什么好一点的方法来做
回复 支持 反对

使用道具 举报

发表于 2008-2-24 02:48:46 | 显示全部楼层
我基本赞同kingthunder 的想法,如果两个文件的行数相同而且操作目标的行数完全对应的话,并不复杂:
  1. #!/bin/bash
  2. i=1
  3. j=`sed -n '$=' a`
  4. while (($i<=j))
  5. do
  6.   mv `sed -n "$i"p a` `sed -n "$i"p b`
  7.   let i+=1
  8. done
复制代码
回复 支持 反对

使用道具 举报

发表于 2008-2-24 12:30:42 | 显示全部楼层
这样把,不用while循环,只用awk,因为awk实际上就是从文件开头一直到结尾都要处理每一行的,其内置变量NR保存的当前行的值,你也可以加自己的变量。(假设a.txt行数大于b.txt
先ALEN=`wc -l <a.txt`
awk "{if((NR<=$ALEN) || (NR>$ALEN&&NR<=2*$ALEN)) "\$1"=\"MV\"} {print $1}" a.txt b.txt
输出:
MV
MV
MV
MV
MV
MV
MV
MV
MV
MV
ff1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-24 23:30:05 | 显示全部楼层
谢谢,再次感谢kingthunder  看样子靠shell本身是不能够解决这个问题的
而awk & sed又是一门学问了。

看样子有时间要看看awk了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表