awk中引用shell变量执行替换的脚本
[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
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更新:
===================================================================
新需求
其中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 'FNR==NR{a[$1]=$2;next}{$2=a[$1];print}' file1 file2
解释一下这个吧,这是使用了awk的内置变量NF和FNR,利用这两个变量,结合数组,先将需要替换的内容组合放到数组里,供匹配使用;
再使用了next这个内置函数模块,这样的话就可以达到先将内容放到数组里,然后执行匹配替换。
这里还有一个精彩的地方,在file2文件里,并没有$2这栏,而在执行的时候使用了不存在的$2;
开始我也疑惑,后来想到,这是一个类似于赋值的方法,原本不存在$2被赋值为替换的内容;
打印该列,print后不接参数等同于print $0
awk中引用shell变量执行替换的脚本的更多相关文章
- awk中引用shell变量的方法
1.通过命令行参数定义变量时引用: awk -v awk变量名= shell变量名 #!/bin/bash var4bash=test awk -v var4awk="$var4bash&q ...
- awk内引用shell变量【自己手动加精】
题目 [root@localhost ~]# cat 1.txt iii sss ddd 执行命令 [root@localhost ~]# A=0 [root@localhost ~]# awk '{ ...
- awk中使用shell变量
方法:使用-v参数. 对于多个shell变量使用多个-v 有个关于shell变量中的空格问题:
- 正则表达式中引用shell变量
注意,是用单引号包含双引号来引用变量 > MAPPING_ID_PO="000001:AP1-TU1000002:AP1-TU2000003:AP1-TU3000004:AP1-TU4 ...
- awk中使用shell的环境变量
awk中使用shell的环境变量一:"'$var'"这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:var="test"awk 'BEGIN ...
- shell变量的替换,命令的替换,转义字符
1,shell变量的替换 变量可以根据变量是否为空或者被删除,而被替换为特定的值 ${var} 变量本来的值 $(var:-word) 如果变量为空,或者已被删除那么返回word,但是不改变va ...
- Awk中调用shell命令
Awk中调用shell命令 需求 在awk中,有时候需要调用linux系统中命令,如计算字符串的MD5值,并保存下来. 方法参考 call a shell command from inside aw ...
- [转帖]Linux教程(20)- Linux中的Shell变量
Linux教程(20)- Linux中的Shell变量 2018-08-24 11:30:16 钱婷婷 阅读数 37更多 分类专栏: Linux教程与操作 Linux教程与使用 版权声明:本文为博 ...
- awk中可以使用system来执行复杂的shell命令
在awk中可以直接执行shell命令. zoer@ubuntu:~$ touch a zoer@ubuntu:~$ touch b zoer@ubuntu:~$ cat a.txt a b zoer@ ...
随机推荐
- Java之CountDownLatch ---控制线程执行顺序
一,类介绍 这是java.util.concurrent包里的一个同步辅助类,它有两个主要的常用方法 countDown()方法以及await()方法.在完成一组正在其他线程中执行的操作之前,它允许 ...
- Django源码分析之程序执行入口分析
一般我们开启一个django项目,最简单的方法是进入project 目录,这时目录结构是这样的 然后我们执行python manage.py runserver,程序就开始执行了. 那django是如 ...
- nodejs+express+mysql实现restful风格的增删改查示例
首先,放上项目github地址:https://github.com/codethereforam/express-mysql-demo 一.前言 之前学的java,一直用的ssm框架写后台.前段时间 ...
- 五分钟学习React(二):我的第一个Hello World
我的第一个React应用 接着我们上一期所讲的内容,通过create-react-app脚手架创建的应用,它是基于ES6的语法生成的.我们清空src目录下的文件,并分别创建index.js和index ...
- squashfs文件系统
一.Squashfs文件系统简介 squashfs是以linux 内核源码补丁的形式发布,附带mksquashfs工具,用于创建squash文件系统.squashfs可以将整个文件系统或者某个单一的目 ...
- Zabbix实战-简易教程--排错(持续收集中)
一.安装错误 1.zabbix 安装故障之无法跳到下一步或点击下一步没反应 执行命令:chownnginx:nginx /var/lib/php/session/ -R 2.proxy上无法采集交 ...
- Android开发艺术探究Note
第一章:Activity的生命周期和启动模式 生命周期 onPause表示activity正在停止,onPaus必须先执行完(栈顶的activity),新的activity的onResume才会执行. ...
- 【一小时入门】webpack 入门指南
什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 我们可以 ...
- Codeforces Beta Round #1 A,B,C
A. Theatre Square time limit per test:1 second memory limit per test:256 megabytes input:standard in ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上, ...