linux awk文件?linux版软件网站
各位老铁们好,相信很多人对linux awk文件都不是特别的了解,因此呢,今天就来为大家分享下关于linux awk文件以及linux版软件网站的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
linuxawk多文件操作2种实现方法
我们经常会将2个有关联文本文件进行合并处理。分别从不同文件获取需要的列,然后,整体输出到一起。awk进行多文件处理时候,常常会遇到2个方面问题,第一个是怎么样合并多个文件为一个文件。第二个问题就是怎么样将多行合并为一行显示。我这里说下我的处理2种方法,还有实现思路。
实例文本:
复制代码代码如下:
[chengmo@centos5 shell]$ awk'FNR==1{print"\r\n"FILENAME}{print$0}' a.txt b.txt
a.txt
100 wang man
200 wangsan woman
300 wangming man
400 wangzheng man
b.txt
100 90 80
200 80 70
300 60 50
400 70 20
需要合并得到结果:
100 wang man 90 80
200 wangsan woman 80 70
300 wangming man 60 50
400 wangzheng man 70 20
awk多文件操作方法一:
实现思路:
通过外部命令合并文件,然后通过排序,然后通过awk进行合并操作。
首先:
复制代码代码如下:
[chengmo@centos5 shell]$ cat a.txt b.txt| sort-n-k1|awk'{print}'
100 90 80
100 wang man
200 80 70
200 wangsan woman
300 60 50
300 wangming man
400 70 20
400 wangzheng man
现在需要把:第一列相同的处理合并到一行,这里需要用“next”语句。它操作,可以参考awk多行合并【next使用介绍】(常见应用4)
继续:
复制代码代码如下:
[chengmo@centos5 shell]$ cat a.txt b.txt| sort-n-k1|awk'NR%2==1{fd1=$2"\t"$3;next}{print$0"\t"fd1}'
100 wang man 90 80
200 wangsan woman 80 70
300 wangming man 60 50
400 wangzheng man 70 20
需要把几行合并,经常用到方法是:NR%num然后将行值保存下来,next该行。在输出时候打印出来。
awk多文件操作方法二
实现思路
不借助第3放工具打开,直接通过awk打开多个文件。然后可以通过:FILENAME获得当前处理文件名。NR总记录 FNR当前文件记录,以及ARGC传入参数总数,ARGV是数组,各个参数值。
看下这些实例:
复制代码代码如下:
[chengmo@centos5 shell]$ awk'BEGIN{print ARGC,ARGV[0],ARGV[1],ARGV[2]}{print FILENAME,NR,FNR,$0}' a.txt b.txt
3 awk a.txt b.txt
a.txt 1 1 100 wang man
a.txt 2 2 200 wangsan woman
a.txt 3 3 300 wangming man
a.txt 4 4 400 wangzheng man
b.txt 5 1 100 90 80
b.txt 6 2 200 80 70
b.txt 7 3 300 60 50
b.txt 8 4 400 70 20
程序代码:
复制代码代码如下:
[chengmo@centos5 shell]$ awk'
BEGIN{
if(ARGC<3)
{
exit 1;
}
file="";
}
{
aData[FILENAME,$1]=ARGV[1]==FILENAME?$0:$2"\t"$3;
}
END{
for(k in aData)
{
split(k,idx,SUBSEP);
if(idx[1]==ARGV[1]&&(ARGV[2],idx[2]) in aData)
{
print aData[ARGV[1],idx[2]],aData[ARGV[2],idx[2]]|"sort-n-k1";
}
}
}' a.txt b.txt
100 wang man 90 80
200 wangsan woman 80 70
300 wangming man 60 50
400 wangzheng man 70 20
代码说明:
这里用到2维数组,aData[文件名,关联列对应值],这种方法可以将多个文件内容。放入一个统一二维数组。然后循环数组,通过if((i,j} in array)查找对应列值,在其它文件中是否存在。
以上是2种实现方法,其中第一种思路较为简单,很容易理解。第二种处理起来较为复杂。有更好方法大家给我分享。
linux shell 有关文件的读取
几点问题:
1)管道符后面的命令都是要新建shell去执行的,也就是说,while循环中的内容都不是在当前shell中执行,而array是在while循环中赋值的,所以当执行完while循环返回到当前shell后,array的值丢失。
这一点必须清楚:新建shell可以继承当前shell的变量,相当于拷贝了变量的一个副本,而命令执行完退出新建shell后,新建shell中的变量也都随之湮灭。
2)awk本身就是逐行读入并处理文件的,while read line也是这样,功能上有重叠,一般用其一即可,特殊情况除外。
3)这就一个字段而已,何必用数组array呢?当然,你要用数组也是可以的,只是我有点不理解。
4)如果$1是一个文件,不需要cat后再通过管道符传递,awk本身就可以直接处理文件
awk-F='$1~/'$args'/{print$2}'$1就可以,管道符能少用则少用。
修改建议:
保留awk,去除while read line,试试:
array=(`awk-F='$1~/'$args'/{print$2}'$1`)
echo${array[0]}
如果要保留你的while read line结构,那么:
whilereadline
do
array=(`echo"$line"|awk-F='$1~/'$args'/{print$2}'`)
done<$1
echo${array[0]}
一文教会你使用Linux三剑客(grep、sed、awk)处理文本文件
大家好,我是怪兽。
作为一名合格的程序员,在实际开发中,我们常常需要在服务器终端执行一些运维操作,而在服务器上没有图形界面,所以处理文本文件显得尤为麻烦。但Linux的强大终端命令提供了比图形界面更强大的功能,今天怪兽将教你快速掌握Linux中的文本处理三剑客——grep、awk、sed。
Linux文本处理三剑客包括grep、awk、sed,它们以正则表达式作为基础。标准和扩展正则表达式在Linux系统中得到支持。首先,我们来明确一下这三剑客的特点及应用场景。
grep命令家族包括grep、egrep、fgrep三个子命令,适用于不同场景。
我们以新建的testGrep文件为例,内容如下:
1.找到包含Grep字符串的所有内容行
2.精确查找Grep4字符串所在的内容行
3.忽略大小写查找test字符串所在的内容行
4.从标准输入来过滤忽略大小写查找test字符串所在的内容行
执行以上命令结果如下:
通过上面的结果可以看到,并非精确查找只包含Grep字符串的内容,而是模糊匹配,只要是包含Grep字符串,其内容都会被检索到。
执行上面的命令并不能查到任何结果,这是因为grep命令默认是严格大小写的,所以如果想要查找到test字符串所在的内容行,必须通过参数设定来忽略大小写。
sed命令是Stream Editor的缩写,在处理行内容时功能强大,通过脚本来处理文本文件或标准输入。
使用sed命令的语法如下,我们通过新建的sedtest.txt文本文件为例:
案例操作总结:
1.参数介绍
2.动作介绍
awk命令由发明该工具的三位作者姓名首字母组成,用于格式化输出,三位作者分别是:
awk按照行来读取文档,根据输入分隔符切分成小部分,用内建变量表示。
常用参数如下,我们以新建的log.txt文本文件为例:
格式化输出内容
指定分隔符格式化输出内容
设置变量并在脚本内使用
通过指定脚本来处理文本文件
awk的三位创建者已将其定义为“样式扫描和处理语言”,详细学习可参考:awk.readthedocs.io/en/l...
接下来通过编写awk脚本来统计学生成绩数据,新建student.txt文本文件,内容如下:
编写script.txt脚本如下:
执行命令并得到执行结果。
通过脚本修改统计计算之前的匹配条件,只统计ss同学的成绩。
总结如下:
可以使用$+数字的形式表示当前行的第几列,$0表示整行内容。
可以通过-F参数指定分隔符。
可以通过-v参数定义变量并在脚本中使用。
可以通过-f参数指定脚本文件位置,实现文本文件处理。
这就是Linux文本处理三剑客grep、awk、sed的使用方法和技巧,希望对你有所帮助!