求一个多文件编辑的shell(已解决)

sh/bash/dash/ksh/zsh等Shell脚本
回复
grufield
帖子: 1
注册时间: 2010-03-18 13:29

求一个多文件编辑的shell(已解决)

#1

帖子 grufield » 2012-08-21 18:35

现在有以下几个文件
1、a.txt
aa.dat 381263
bb.dat 515821

2、b.dat
CLASS 20120622192745 N GRADE COUNT


3、aa.bat
aa 20120107000000000 19950427000000 20120107000000 01001500
aa 20120107000000000 19950427000000 20120107000000 01001500
aa 20120107000000000 19950427000000 20120107000000 01003640
aa 20120107000000000 19950427000000 20120107000000 01003640
aa 20120107000000000 20060124000000 20120107000000 02080011
aa 20120107000000000 20060124000000 20120107000000 02080011
aa 20120107000000000 20051216000000 20120107000000 02080012


4、bb.dat
bb 20120107000000000 19950427000000 20120107000000 01001500
bb 20120107000000000 19950427000000 20120107000000 01001500
bb 20120107000000000 19950427000000 20120107000000 01003640
bb 20120107000000000 19950427000000 20120107000000 01003640
bb 20120107000000000 20060124000000 20120107000000 02080011
bb 20120107000000000 20060124000000 20120107000000 02080011
bb 20120107000000000 20051216000000 20120107000000 02080012


求一个shell,在a.txt文件中取每个dat对应的数字,替换b.dat文件中的COUNT,再把替换后的b.dat文件内容,加到aa.dat,bb.dat文件的最前面。(文件字段间用tab分割)谢谢大家啊~~~~

生成后的文件:
1、aa.bat
CLASS 20120622192745 N GRADE 381263
aa 20120107000000000 19950427000000 20120107000000 01001500
aa 20120107000000000 19950427000000 20120107000000 01001500
aa 20120107000000000 19950427000000 20120107000000 01003640
aa 20120107000000000 19950427000000 20120107000000 01003640
aa 20120107000000000 20060124000000 20120107000000 02080011
aa 20120107000000000 20060124000000 20120107000000 02080011
aa 20120107000000000 20051216000000 20120107000000 02080012


2、bb.dat
CLASS 20120622192745 N GRADE 515821
bb 20120107000000000 19950427000000 20120107000000 01001500
bb 20120107000000000 19950427000000 20120107000000 01001500
bb 20120107000000000 19950427000000 20120107000000 01003640
bb 20120107000000000 19950427000000 20120107000000 01003640
bb 20120107000000000 20060124000000 20120107000000 02080011
bb 20120107000000000 20060124000000 20120107000000 02080011
bb 20120107000000000 20051216000000 20120107000000 02080012

符合我要求的答案:(谢谢大家的帮忙)

awk '{if(NR==FNR){insert=$0}else{to_insert=insert;sub("COUNT", $2, to_insert);cmd="sed -i \"1i"to_insert"\" "$1;system(cmd)}}' b.dat a.txt
上次由 grufield 在 2012-08-21 21:55,总共编辑 1 次。
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 求一个多文件编辑的shell

#2

帖子 枫叶饭团 » 2012-08-21 19:28

不想写,看着shell好烦啊
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 求一个多文件编辑的shell

#3

帖子 lilydjwg » 2012-08-21 20:06

枫叶饭团 写了:不想写,看着shell好烦啊
+1
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 求一个多文件编辑的shell

#4

帖子 naturalaw » 2012-08-21 21:16

lilydjwg 写了:
枫叶饭团 写了:不想写,看着shell好烦啊
+1
不是shell烦,数据给得太多了,表述不清楚需求。
  • The eternal law
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 求一个多文件编辑的shell

#5

帖子 naturalaw » 2012-08-21 21:28

3、4里的数据属于干扰数据,我只要一行。
1、a.txt
aa.dat 381263
bb.dat 515821

2、b.dat
CLASS 20120622192745 N GRADE COUNT

3、aa.bat
aa 20120107000000000 19950427000000 20120107000000 01001500

4、bb.dat
bb 20120107000000000 19950427000000 20120107000000 01001500


求一个shell,在a.txt文件中取每个dat对应的数字,替换b.dat文件中的COUNT,再把替换后的b.dat文件内容,加到aa.dat,bb.dat文件的最前面。(文件字段间用tab分割)谢谢大家啊~~~~

生成后的文件:
1、aa.bat
CLASS 20120622192745 N GRADE 381263
aa 20120107000000000 19950427000000 20120107000000 01001500

2、bb.dat
CLASS 20120622192745 N GRADE 515821
bb 20120107000000000 19950427000000 20120107000000 01001500
不过,可能用python好些。
  • The eternal law
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 求一个多文件编辑的shell

#6

帖子 naturalaw » 2012-08-21 22:10

[bash]#!/bin/bash
unset fn;for i in `awk '{print $1}' a.txt`;do fn=(${fn[@]} $i) ;done
unset nu;for i in `awk '{print $2}' a.txt`;do nu=(${nu[@]} $i) ;done
total=${#nu[@]}
end=`expr $total - 1`

for i in `seq 0 $end`;do
echo $i ${fn[$i]}
sed -i "1iCLASS 20120622192745 N GRADE ${nu[$i]}" ${fn[$i]}
echo $i
done
exit 0
[/bash]
坑人,居然 不是等宽字体!
  • The eternal law
回复