Chinaunix

标题: 文本处理问题 [打印本页]

作者: dashorc    时间: 2009-07-01 13:02
标题: 文本处理问题
cat file1
ASN1.1,None,62373488,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474
62373500
62373504



cat file2

62372069
62372109

我现在想把这两个文件合并成下面的一个文件:
ASN1.1,None,62373488,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474
ASN1.1,None,62373500,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474
ASN1.1,None,62373504,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474
ASN1.1,None,62372069,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474
ASN1.1,None,62372069,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474

以file1的第一个文件为标准,替换第三域,其他不变

[ 本帖最后由 dashorc 于 2009-7-1 13:05 编辑 ]
作者: blackold    时间: 2009-07-01 13:09
看不明白。
作者: moartel    时间: 2009-07-01 13:13
cat file* |sed '/^\([0-9]\)/s/\([0-9]\)/ASN1.1,None,\1,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474/'
作者: dashorc    时间: 2009-07-01 13:20
标题: 回复 #3 moartel 的帖子
谢谢,我怎么就想不到呢,哎
作者: blackold    时间: 2009-07-01 13:23
awk:
  1. awk 'NR==1{r=$0;print;next}{sub(/None,[0-9]+/,"None,"$1,r);print r}' file1 file2
复制代码

作者: ywlscpl    时间: 2009-07-01 13:23
终于给看明白了
  1. [root@Mylinux tmp]# awk 'NR==1{v=$0;print v}NR>1{v1=v;sub(/62373488/,$1,v1);prin
  2. t v1}' file1 file2
  3. ASN1.1,None,62373488,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474
  4. ASN1.1,None,62373500,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474
  5. ASN1.1,None,62373504,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474
  6. ASN1.1,None,62372069,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474
  7. ASN1.1,None,62372109,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474
复制代码

作者: dashorc    时间: 2009-07-01 13:32
cat file* |sed '/^\([0-9]\)/s/\([0-9]\)/ASN1.1,None,\1,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474/'

ASN1.1,None,6,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU001234742373500
ASN1.1,None,6,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU001234742373504
ASN1.1,None,6,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU001234742373520
ASN1.1,None,6,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU001234742373524
ASN1.1,None,6,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU001234742373527
ASN1.1,None,6,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU001234742373529

不对
作者: blackold    时间: 2009-07-01 13:35
改一下啊|sed '/^[0-9]\+/s//ASN1.1,None,&,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474/'
作者: dashorc    时间: 2009-07-01 13:42
谢谢黑哥和ywlscpl 指点,又学了不少东西
作者: moartel    时间: 2009-07-01 13:49
原帖由 blackold 于 2009-7-1 13:35 发表
改一下啊|sed '/^[0-9]\+/s//ASN1.1,None,&,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474/'

黑哥的简单多了

之前的少了个*
cat file* |sed '/^[0-9]/s/\([0-9]*\)/ASN1.1,None,\1,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474/'
作者: dashorc    时间: 2009-07-01 16:28
原帖由 blackold 于 2009-7-1 13:35 发表
改一下啊|sed '/^[0-9]\+/s//ASN1.1,None,&,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474/'



ASN1.1,None,&,5,N2603BBOO,20090629 22:25,SZ,TX,DHL,None,AU00123474 这一串数字一直会变,能用变量代替吗?
作者: blackold    时间: 2009-07-01 16:29
标题: 回复 #11 dashorc 的帖子
如何变法?你要说清楚。
作者: dashorc    时间: 2009-07-01 16:35
原帖由 blackold 于 2009-7-1 16:29 发表
如何变法?你要说清楚。


我换个简单的例子:
有两个目录dir1 dir2
dir1下面的文件:
cat file1
ASN,1,123,hello
456
789

cat file2
111
222
333

cat file3
999
888
777

dir2下面的文件:
cat file1
SSS,1,SZ456,HAHA
SZ123
SZ555

cat file2
SZ789
SZ222

每个目录下面分别进行替换,也就是dir1下面生成一个文件:
ASN,1,123,hello
ASN,1,456,hello
ASN,1,789,hello
ASN,1,111,hello
ASN,1,222,hello
ASN,1,333,hello
ASN,1,999,hello
ASN,1,888,hello
ASN,1,777,hello

dir2下面生成一个文件:
SSS,1,SZ456,HAHA
SSS,1,SZ123,HAHA
SSS,1,SZ555,HAHA
SSS,1,SZ789,HAHA
SSS,1,SZ222,HAHA

[ 本帖最后由 dashorc 于 2009-7-1 16:38 编辑 ]
作者: blackold    时间: 2009-07-01 16:47
标题: 回复 #13 dashorc 的帖子
到每个目录下执行脚本, 比如

  1. $ pwd
  2. dir1
  3. $ awk 'NR==1{r=$0;print;next}{sub(/None,[0-9]+/,"None,"$1,r);print r}' file* > newfile
复制代码

作者: dashorc    时间: 2009-07-01 16:55
标题: 回复 #14 blackold 的帖子
[root@tommy dir1]# awk 'NR==1{r=$0;print;next}{sub(/None,[0-9]+/,"None,"$1,r);print r}' file1
ASN,1,123,hello
ASN,1,123,hello
ASN,1,123,hello

是我的awk版本问题吗?
[root@tommy dir1]# awk -W version
GNU Awk 3.1.3
作者: blackold    时间: 2009-07-01 17:16
标题: 回复 #15 dashorc 的帖子
Sorry. 脚本要修改一下:
  1. awk 'NR==1{r=$0;print;next}{print gensub(/[^,]+/,$1,3,r)}' file*
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2