快速排序 php-Linux中awk命令的使用详解–三个经典案例演示

概述

awk 是一个报告生成器,具有强大的文本格式化功能。 这是一个专业术语。

你可能不明白报告生成器中所谓的“报告”是什么。 您可以将“报告”理解为“报告”或“表格”。 换句话说,我们可以使用 awk 命令将一些文本组织成我们想要的内容。 例如,将一些文本组织成一个“表格”,然后显示出来。 刚才概念中提到的“文本低格式能力”就是这个意思。 其实可能不太容易理解。 别担心,当你看到前面的“例子”时,你自然会明白awk所擅长的“文本低格式”能力。

下面我分享3个awk的例子,通过这三个awk的例子来帮助大家理解awk的一些命令模式。

awk 基础知识

awk的基本句型如下。 如果你听不懂也没关系。 我们将逐步举例。

awk [options] 'program' file1 , file2 , ```

排序快速填充_快速排序 php_排序快速排序

对于上述句型中的程序快速排序 php,可以细分为句型和动作。 也就是说awk的基本句型如下

awk [options] 'Pattern{Action}' file

从字面上理解,action就是行动。 awk擅长低格式文本,输出低格式后的文本。 因此,awk最常用的动作是print和printf,因为awk要输出低格式后的文本。 因此,这两个动作是最常用的。

awk 逐行处理。 逐行处理是指awk处理文本时,会逐行处理。 处理完当前行后,将处理下一行。 默认情况下,awk 使用“换行符”作为标记来标识每一行。 一行,也就是说awk就像我们人类一样。 每次遇到“回车换行”快速排序 php,它就认为是当前行的结束和新行的开始。 awk 会根据用户指定的分隔符分割当前行。 如果没有指定分隔符。 默认情况下,使用空格作为分隔符。

ps:grep、sed、awk被称为Linux中的“三剑客”。

排序快速排序_快速排序 php_排序快速填充

grep 更适合简单地搜索或匹配文本

sed更适合编辑匹配的文本

awk更适合低格式文本,对文本进行更复杂的格式处理。

1.类似于数据库中的左连接查询

基本信息

[root@nwppdb opt]# cat a.txt 
111 aaa
222 bbb
333 cccc
444 ddd
[root@nwppdb opt]# cat b.txt 
111 123 456
2 abc cbd
444 rts 786

要求:输出结果为:

111,aaa,123,456
444,ddd,rts,786

实现方法一:

[root@nwppdb opt]# awk 'NR==FNR{a[$1]=$2;}NR!=FNR && a[$1]{print $1","a[$1]","$2","$3}' a.txt b.txt
111,aaa,123,456
444,ddd,rts,786

快速排序 php_排序快速填充_排序快速排序

说明:当NR 和FNR 相同时,表示正在操作第一个文件。 a[$1]=$2 表示创建一个字段,以第一个数组为下标,第二个数组为值。 当NR!=FNR时,表示正在操作第二个文件。 注意:此时的$1和上面的$1不是一回事。 前面的$1代表a.txt的第一个数组,而旁边的$1代表b.txt的第一个数组。 a[$1]表示以b.txt中的第一个数组为下标的值。 如果a[$1]有值,则说明a.txt文件中也存在,所以只需打印数据即可。

实现方法2、

[root@nwppdb opt]# awk -v OFS="," 'NR==FNR{a[$1]=$2;} NR!=FNR && $1 in a { print $1,a[$1],$2,$3}' a.txt b.txt
111,aaa,123,456
444,ddd,rts,786

说明: -v OFS="," 这是设置输出时的列分隔符。 $1 in a 是b.txt文件中第一列的值是否在链表a的key中。 这对于编程很有用。 这很容易理解。 各种语言中都有这样的用法或功能。 例如php中有in_array函数。 对比一下方法一和技巧二的打印结果,我在方法一中加了双冒号,方法二中没有加,但输出效果是一样的。

2. 删除重复值

排序快速排序_排序快速填充_快速排序 php

基本信息:

[root@nwppdb opt]# cat c.txt 
a b
c d
e f
b d
b a
f e
1 2
2 1

要求:如果存在a、b和b、a这样的情况,则删除b和a,即消除重复值。 当然,数字也是如此;

实现方法一:

[root@nwppdb opt]# awk '{for(i=1;i<=NF;i++)a[i]=$i;asort(a);for(i=1;i<=length(a);i++)printf a[i]"t";printf "n"}' c.txt|sort|uniq
1	2	
a	b	
b	d	
c	d	
e	f	

解释: for(i=1;i