对比文件内容

需求从A文件当中查找不存在B文件当中的内容

方案1、

diff -B a.txt b.txt |awk '/</{print $2}'

#如果文件过大diff会超出内存就没法玩了~

方案2、

sort a.txt b.txt b.txt | uniq -u > c.txt
#排序并去重

方案3、

awk '{if(ARGIND==1) {val[$0]}else{if($0 in val)  delete val[$0]}}END{for(i in val) print i}'  a.txt b.txt > c.txt

其他命令参考:

#拆分文件
split -l 5000000 -d -a 3 c.txt
将c.txt按照每个文件500w行拆分,后缀是数字,并且后缀长度是3

AWK第二课

1、工作原理
例子:
cat /etc/passwd |awk -F ‘:’ ‘BEGIN {print “name”} {print $1} END {print “Joyous”}’
说明:
awk是先执行BEGIN,然后去读文件,一行一行读取,-F指定了每行按照:分割,其中$0标示当前行,$1标示分割第一个区域,$n标示第n个区域。一直到读取完毕,最后执行END
2、正则匹配
awk -F: ‘/^root/{print $1}’ /etc/passwd
说明:搜索root开头的行打印第一个区域
3、内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
示例:
awk -F’:’ ‘{print “filename:” FILENAME “,line:” NR “,cols:” NF}’ /etc/passwd
4、printf格式化输出
awk -F ‘:’ ‘{printf(“filename:%s,linenumber:%s,columns:%s,linecontent:%s\n”,FILENAME,NR,NF,$0)}’ /etc/passwd
5、编程
定义变量可以在action块定义,语句使用;分开
awk ‘BEGIN {count=0;} {count++; print $0;} END{print “user count is “, count}’ /etc/passwd
条件语句if(){}else{}
6、函数
length(string)返回字符串的长度
index(string,find)返回子字符串在父字符串位置
tolower(string)将所有字符都转成小写
toupper(string)将所有字符都转成大写
substr(string,strat,length)截取字符串
match(string,ereg)支持正则匹配
sub(reg,rep,string)替换匹配的第一个字符序列
gsub(reg,rep,string)替换匹配的全部字符序列
split(string,arr,char)分割字符

参考:
http://www.gnu.org/software/gawk/manual/gawk.html