Chinaunix

标题: sed 文本替换 求大神指点 [打印本页]

作者: 潇潇幕友    时间: 2017-01-20 00:04
标题: sed 文本替换 求大神指点
本帖最后由 潇潇幕友 于 2017-01-20 00:03 编辑

有文件
a.txt
111  222
222  333
333  444
b.txt
aaa AAA
bbb BBB
ccc  CCC
每次获取b.txt的一行,并将a.txt中的111替换成获取到内容的第1列,222替换成获取到内容的第2列;且将结果追加输出到c.txt。输出结果如下:
aaa  AAA
AAA 333
333 444
bbb  BBB
BBB 333
333  444
ccc   CCC
CCC  333
333  444
如何通过脚本实现?求大神指点!!!


作者: jason680    时间: 2017-01-20 03:38
回复 1# 潇潇幕友

$ awk 'FNR==NR{for(n=1;n<=NF;++n)a[NR,n]=$n;R=NR;next}{delete c;for(r=1;r<=R;++r){s="";for(n=1;n<=NF;++n){if(r==1)c[a[1,n]]=$n;s=s (c[a[r,n]]?c[a[r,n]]:a[r,n])" "}print s}}' a.txt b.txt
aa AAA
AAA 333
333 444
bbb BBB
BBB 333
333 444
ccc CCC
CCC 333
333 444


作者: jcdiy0601    时间: 2017-01-20 10:06
  1. #!/bin/bash

  2. while read line
  3. do
  4.   a=`echo ${line}|awk '{print $1}'`
  5.   b=`echo ${line}|awk '{print $2}'`
  6.   cat a.txt|sed 's/111/'$a'/;s/222/'$b'/' >> c.txt
  7. done < b.txt
复制代码

  1. #!/usr/bin/env python
  2. #_*_ coding:utf-8 _*_
  3. # Author: jiachen

  4. FileName1 = "a"
  5. FileName2 = "b"
  6. FileList = []

  7. def read_file(file_name,file_list):
  8.     with open(file_name,"r") as read_f:
  9.         for line in read_f.readlines():
  10.             file_list.append(line.strip().split())
  11.     return file_list

  12. def write_file(file_name,new_file_name,file_list):
  13.     with open(file_name,"r") as read_f,open(new_file_name,"w") as write_f:
  14.         for i in file_list:
  15.             x,y = i[0],i[1]
  16.             while True:
  17.                 content = read_f.readline().strip()
  18.                 if content:
  19.                     content = content.replace("111",x)
  20.                     content = content.replace("222",y)
  21.                     write_f.write(content + "\n")
  22.                 else:
  23.                     read_f.seek(0)
  24.                     break
  25.     return 1

  26. if __name__ == "__main__":
  27.     FileList = read_file(FileName2,FileList)
  28.     write_file(FileName1,"c",FileList)
复制代码

作者: haooooaaa    时间: 2017-01-20 10:52
  1. awk 'NR==FNR{$1=$1;s=s?s"\n"$0:$0;next}{m=s;gsub("111",$1,m);gsub("222",$2,m);print m}' a b            
  2. aaa AAA
  3. AAA 333
  4. 333 444
  5. bbb BBB
  6. BBB 333
  7. 333 444
  8. ccc CCC
  9. CCC 333
  10. 333 444
复制代码

作者: haooooaaa    时间: 2017-01-20 11:55
本帖最后由 haooooaaa 于 2017-01-20 14:10 编辑
  1. sed -rn '/^[0-9]/H;/^[a-z]/{G;s/(^\S+)(.+)(111)/\1\2\1/g;:a;s/(^\S+) (\S+)(.+)(222)/\1 \2\3\2/;ta;s/^[^\n]+\n+//;p}' a b
  2. aaa  AAA
  3. AAA  333
  4. 333  444
  5. bbb  BBB
  6. BBB  333
  7. 333  444
  8. ccc  CCC
  9. CCC  333
  10. 333  444
复制代码


作者: moperyblue    时间: 2017-01-20 15:14

  1. sed -r '1{x;s/.*/sed 1d a.txt/e;x};G;s/(\S+)\n\S+/\1\n\1/' b.txt
复制代码





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