遇到问题:
现在有两个脚本,我想
将file1中的内容按file2来匹配
[root@154 home]# cat file1
3-1-1 POTV=1,POTA=0,POTP=2
1-4-76 POTV=1,POTA=0,POTP=1
2-1-2 POTV=1,POTA=1,POTP=1
3-1-4 POTV=1,POTA=1,POTP=2
4-1-5 POTV=1,POTA=1,POTP=2
7-1-2 POTV=1,POTA=1,POTP=2
3-1-10 POTV=1,POTA=1,POTP=2
1-1-1 POTV=1,POTA=2,POTP=0

 

[root@154 home]# cat file2
1-1-1
2-1-2
2-1-3
3-1-4
4-1-5

  

相当于grep的精确匹配,不过是用awk实现的
grep -w '1-1-1' file1
实现用for in循环取值,赋予变量
 
写了一个替换思路用for in循环将匹配内容变为变量,然后匹配替换
for i in `cat file2`
do
awk  '$1==''"'$i'"''{print $0}' file1 >> urfile
done
 
awk  '$1=='   '"'   $i   '"'    '{print $0}'   file1
这段中单引号是脱义的作用
在awk中精确匹配字符,需要将字符用双引号引用:

awk '$1=="1-1-1"{print $0}' test
所以对传递参数要用单引号将双引号脱义让awk识别
单引号成对出现是按就近原则来的

  

这里需要注意的是,这里引用的'$1=='   '"'   $i   '"'    '{print $0}'里面不能有空格,不然会发生语法错误

(猜想大概是因为IFS分段原因,awk被分成了几段话,造成语法错误)

[root@154 home]# cat aemployee.txt
101 John Doe,CEO
102 Jason Smith,IT Manager
103 Raj Reddy,Sysadmin
104 Anand Ram,Developer
105 Jane Miller,Sales Manager
[root@154 home]# awk '$1==''"'101'"''{print $0}' aemployee.txt
101 John Doe,CEO
[root@154 home]# awk '$1==' '"'101'"''{print $0}' aemployee.txt
awk: cmd. line:1: $1==
awk: cmd. line:1: ^ unexpected newline or end of string

  这里就能看出来,应该跟我猜的一样,如果有不对,请大神指点

2017/07/01更新:

之前的方法太蠢了,改进下,因为之前实验失败,所以认为这样是不行的,不过发现好像是之前实验错误:
awk '$1=="'$i'"{print $0}' file1 >> urfile

===================================================================

新需求

其中file1只有270行,
             file2有345行,
             file1的第一列内容都包含在file2中
             这是两个文件的关系
要求:
      我想以file2为样本,将file1第一列匹配file2行进行替换

即file2的第一行为
1-1-1
在file1中存在
1-1-1 POTV=1,POTA=2,POTP=0
然后将file2中内容替换为file1中该行内容(或者添加file1中第二列内容)
即变成以下样子
1-1-1 POTV=1,POTA=2,POTP=0
1-1-2
1-1-3
1-1-4
1-1-5

-------------------------------------------------------------------------

自己编了一个脚本,毕竟没有基础,大神莫笑

脚本1

#!/bin/bash

for i in `cat yrsd`
do
s=`awk '$1==''"'$i'"''{print $0}' test`
if [ "$s" == "" ];
then echo "$i" >>1
else
echo "$s" >>1
fi
done

 脚本2

	#!/bin/bash

	for i in `cat yrsd`
do
echo $i
if [ -z "$(awk '$1==''"'$i'"''{print $0}' test)" ];
then echo "$i" >>1
else
echo "$(awk '$1==''"'$i'"''{print $0}' test)" >>1
fi
done

  

 
既然已经实现了awk替换,那加个判断就能搞定
另外,大神给的方法
 
awk 'FNR==NR{a[$1]=$2;next}{$2=a[$1];print}' file1 file2

  解释一下这个吧,这是使用了awk的内置变量NF和FNR,利用这两个变量,结合数组,先将需要替换的内容组合放到数组里,供匹配使用;

  再使用了next这个内置函数模块,这样的话就可以达到先将内容放到数组里,然后执行匹配替换。

  这里还有一个精彩的地方,在file2文件里,并没有$2这栏,而在执行的时候使用了不存在的$2;

  开始我也疑惑,后来想到,这是一个类似于赋值的方法,原本不存在$2被赋值为替换的内容;

  打印该列,print后不接参数等同于print $0

 
使用awk的FNR与NR的区别,利用数组,一条命令搞定
这里的知识点还是挺多的,看我这篇分析吧,讲的更详细

awk中引用shell变量执行替换的脚本的更多相关文章

  1. awk中引用shell变量的方法

    1.通过命令行参数定义变量时引用: awk -v awk变量名= shell变量名 #!/bin/bash var4bash=test awk -v var4awk="$var4bash&q ...

  2. awk内引用shell变量【自己手动加精】

    题目 [root@localhost ~]# cat 1.txt iii sss ddd 执行命令 [root@localhost ~]# A=0 [root@localhost ~]# awk '{ ...

  3. awk中使用shell变量

    方法:使用-v参数. 对于多个shell变量使用多个-v 有个关于shell变量中的空格问题:

  4. 正则表达式中引用shell变量

    注意,是用单引号包含双引号来引用变量 > MAPPING_ID_PO="000001:AP1-TU1000002:AP1-TU2000003:AP1-TU3000004:AP1-TU4 ...

  5. awk中使用shell的环境变量

    awk中使用shell的环境变量一:"'$var'"这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:var="test"awk 'BEGIN ...

  6. shell变量的替换,命令的替换,转义字符

    1,shell变量的替换 变量可以根据变量是否为空或者被删除,而被替换为特定的值 ${var}  变量本来的值 $(var:-word)   如果变量为空,或者已被删除那么返回word,但是不改变va ...

  7. Awk中调用shell命令

    Awk中调用shell命令 需求 在awk中,有时候需要调用linux系统中命令,如计算字符串的MD5值,并保存下来. 方法参考 call a shell command from inside aw ...

  8. [转帖]Linux教程(20)- Linux中的Shell变量

    Linux教程(20)- Linux中的Shell变量 2018-08-24 11:30:16 钱婷婷 阅读数 37更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文为博 ...

  9. awk中可以使用system来执行复杂的shell命令

    在awk中可以直接执行shell命令. zoer@ubuntu:~$ touch a zoer@ubuntu:~$ touch b zoer@ubuntu:~$ cat a.txt a b zoer@ ...

随机推荐

  1. Undefined symbols for architecture arm64(其cpu架构)

    "_OBJC_CLASS_$_XXX",referenced from: 之类的问题,很多人看到这些很头疼,不知道从何下手去修改.以下是我总结的相关修改办法.如下图 这是一个很明显 ...

  2. HTML5——localStorage

    html5的学习,忘记的差不多了,特地拿出来重新记录一下,从它的本地存储开始吧! 假设这样的html结构: <div id= "one_storage" class=&quo ...

  3. 基于PDO的简易ORM

    #基于PRO的一个简单地ORM GitHub 项目地址 #在用原生写脚本的时候怀念起框架中封装好的ORM,所以仿照laravel写了这个简洁版的ORM,可以链式操作. #实现功能 ###条件函数 ta ...

  4. Python => ValueError: unsupported format character 'Y' (0x59)

    产生问题的原因是:SQL语句的'%Y-%m-%d'部分被再次解释为字符串格式,并抛出错误 解决方案一:字符串%形式进行替换 '%string' % string. '%Y-%m-%d'改写为'%%%% ...

  5. cs231n spring 2017 lecture13 Generative Models 听课笔记

    1. 非监督学习 监督学习有数据有标签,目的是学习数据和标签之间的映射关系.而无监督学习只有数据,没有标签,目的是学习数据额隐藏结构. 2. 生成模型(Generative Models) 已知训练数 ...

  6. deeplearning.ai 人工智能行业大师访谈 Ruslan Salakhutdinov 听课笔记

    Ruslan Salakhutdinov一方面是苹果的研究主管,另一方面是CMU的教授. 1. Ruslan说自己进入深度学习完全是运气,他在多伦多大学读硕士,然后休学了一年,他在金融领域工作,那时候 ...

  7. BZOJ:4333: JSOI2012 智者的考验

    4333: JSOI2012 智者的考验 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 68  Solved: 18[Submit][Status][ ...

  8. 【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结

    本文将整理 java.util.Arrays 工具类比较常用的方法:  本文介绍的方法基于JDK 1.7 之上.  1.  asList方法 @SafeVarargs public static &l ...

  9. bzoj:1656 [Usaco2006 Jan] The Grove 树木

    Description The pasture contains a small, contiguous grove of trees that has no 'holes' in the middl ...

  10. 剪邮票dfs+bfs+组合+结构体

    #include<iostream>#include<queue>using namespace std;struct Point{ int x; int y; };queue ...