删除两文件中相同的行,列出两个文件中不同的行:
cat 09-07_as_route 09-14_as_route | sort | uniq -u | sort -n -
或
awk '{print}' 09-07_as_route 09-14_as_route | sort | uniq -u | sort -n
注: 这两个文件09-07_as_route 09-14_as_route 都是排序去重后处理过的。
找出文件文件2(09-14_as_route)中有,文件1(09-07_as_route)中没有的那些行:
awk 'NR==FNR{a[$0]=1}NR>FNR{if(a[$0]!=1)print}' 09-07_as_route 09-14_as_route
或:
grep -vf 09-07_as_route 09-14_as_route
或
grep -wvf 09-07_as_route 09-14_as_route
解释:
NR==FNR{a[$0]=1}这句的意思是读取第一个参数(文件)内容,把里面的内容存到a变量中,并赋值为1
NR>FNR{if(a[$0]!=1)print}这句就是读取第二个参数(文件)内容,如果文件内容在a数组里面没有值,那么就打印!
找出文件1和文件2中相同的行:
cat 09-07_as_route 09-14_as_route | sort | uniq -d | sort -n
或
grep -f 09-07_as_route 09-14_as_route 或 grep -f 09-14_as_route 09-07_as_route
也可以使用comm,但使用comm比较的结果不准。????
可参考:http://blog.youkuaiyun.com/shuckstark/article/details/7872176
comm - 12 就只显示在两个文件中都存在的行;
comm - 23 只显示在第一个文件中出现而未在第二个文件中出现的行;
comm - 123 则什么也不显示。
例如:找出a.txt文件有而b.txt文件中没有的放在c.txt文件中
[cpp] view plaincopy #!/bin/sh
# author by tianmo
# date 2011-11-21 20:33
#BEGIN
cat a.txt | sort | uniq | sort > a_u.txt
cat b.txt | sort | uniq | sort > b_u.txt
comm -23 a_u.txt b_u.txt > c.txt
# END
awk 用法例举:
变量名 含义
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符
NF是域的个数
$NF 是输出最后一个域的内容
NR和FNR的不同
NR:表示当前记录数
FNR:也表示当前记录数,但是FNR的作用域只在一个文件内.如果重新打开文件,FNR会从1开始.