Linux shell中关于两个文件的部分内容替换的问题,详情如下:

A文件:格式内容为:。。。。*DDD=111222233334444*222289676878787878*。。。。。*。。。。。。。。。。其中DDD是关键字,*表示续行... A文件:格式内容为:
。。。。
*DDD= 111 2222 3333 4444
*222 289 6768 7878 7878
*。。。。。
*。。。。。
。。。。。其中DDD是关键字,*表示续行;
B文件是:
TIME1 T2 T3 T4
xxx xxxx xxx xxx
xxx xxx xxx xxx
。。 。。 。。 。。
要实现的目标就是将B文件的T2列下面的数据替换掉A文件中关键字'DDD'后面的以及续行上的数据,即最后结果为:
。。。。(不变)
*DDD= xxxx xxx xx xxxx xxxx(每行8个数据)
* xxxx xxxxx xxx xxxx xxxxx(8个数据)
* xxxx 。。。。。。。。。
* xx 。。。。。。。。。
。。。。。。。(不变的部分)
求大神解答
展开
 我来答
微水文00
2014-11-20 · TA获得超过392个赞
知道大有可为答主
回答量:2597
采纳率:0%
帮助的人:1451万
展开全部
这个都是小意思, 就是shell编程的问题。
如果楼主方便的话, 可以帮忙看一下的。
对了, 以后的Linux系统管理问题, shell编程问题,python的开发需求或者是apache, nginx ,php都行啊!
追问
我最近才开始学shell编程,也看了sed命令和awk命令,可是对于这个问题还是没有头绪,能不能请教一下应该用什么命令来实现呢?
追答
这个要结合awk和se的 , 不过重要的是编程的思路啊,也就是为什么经验在企业中是很值钱的道理了。
如果楼主可以的话, 可以看下网名吗?
百度网友5311d79
2014-11-20 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3212万
展开全部
#!/bin/sh
start=`sed -n '/DDD=/=' A` #得到替换的起始行
pos=$start #pos为行计数器
awk 'NR>1{a=a" "$2;if(NR%8==1){print a;a=""}}' B | while read line
do
    sed -i $pos'c\'"$line" A #替换行内容
    let pos+=1 #递增替换行
done
sed -i $start's/.*/DDD=&/' A #在数据起始行的行首加上"DDD="

既然是替换,那么数据行数肯定是相等的吧?

追问
首先谢谢大侠的帮助了。然后就是数据行数和个数都不一定相等。假设A文件关键字DDD后面有30行数据(以*号续行的,31行以后为其他不需要替换的数据)。然后B文件T2列有400个数据,现在就用这400个数据去替换A的30行数据,每行8个400个就是50行了。或者B文件只有200个数据,那每行8个就是25行,现在就要用这25行去替换A文件的那30行数据了。不知道我说清楚没。
追答

如果行数不等,就不能像上面那样直接按行替换了。需要先删除A文件中的原数据,然后再插入新数据。

而要删除原数据,就需要知道原数据的起始行和结束行。起始行可以通过匹配“DDD=”,结束行最好也有个关键字;如果没有,我这里只能先按照你提供的30行长度和起始行位置来计算。

#!/bin/sh
start=`sed -n '/DDD=/=' A` #得到替换的起始行
let end=start+30-1 #计算得到结束行
sed -i $start','$end'd' A #删除原数据

pos=$start #pos为行计数器
awk 'NR>1{a=a" "$2;if(NR%8==1){print a;a=""}}' B | while read line
do
    sed -i $pos'i\'"$line" A #插入新数据行
    let pos+=1 #递增插入行位置
done
sed -i $start's/.*/DDD=&/' A #在数据起始行的行首加上"DDD="
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式