1. 求文件交集、並集、差集
1.1 使用命令comm
comm命令按行比較兩個已對記錄排序的文件。要注意兩個文件必須是排序和唯一(sorted and unique)的,默認輸出為三列,第一列為是A-B,第二列B-A,第三列為A交B。
選項:-1 排除僅在文件1 中出現的記錄
-2 排除僅在文件2 中出現的記錄
-3 排除同時在文件1 和 2中出現的記錄
1.2 使用sort 和 uniq命令
前提:文件1和文件2都是已去重。
求交集:cat file1 file2 | sort | uniq -d
求並集不去重:cat file1 file2 | sort
求並集去重:cat file1 file2 | sort -u
求差集:cat file1 file2 | sort | uniq -d > temp
cat file1 temp | sort | uniq -u
2. 隨機取若干條記錄
awk中使用rand()函數
cat file | awk '{print rand() "|" $1}' | sort -k1 -t"|" | awk -F'|' '{print$2}' |head -5
3. 分組求和
3.1 將第一列相同的記錄的第二列數值相加並打印:awk -F'|' '{a[$1]+=$2}END{for(i in a){print i"|"a[i]}}' file1 file2
3.2 將第一列和第二列都相同的記錄的第三列相加並將結果打印出來:awk -F'|' '{a[$1"|"$2]+=$3}END{for(i in a){print i"|"a[i]}}' file
3.3 根據第一列,分別將第二列和第三列的數值相加並打印:awk -F'|' '{a[$1]+=$2;b[$1]+=$3}END{for(i in a){print i"|"a[i]"|"b[i]}}' file
4. 匹配
4.1 匹配交集項
若file中記錄的第一列在list中記錄的第一列出現過,則輸出該記錄在file中的整列:awk -F'|' 'NR==FNR{a[$1]=1}NR>FNR&&a[$1]==1{print$0}' list file
4.2 匹配非交集項
若file中記錄的第一列未在list中的第一列出現過,則輸出該記錄在file中的整行:awk -F'|' 'NR==FNR{a[$1]=1}NR>FNR&&a[$1]!=1{print$0}' list file
5. 取最大值最小值
5.1 單列記錄
求單列記錄中最大值的列:awk -F'|' 'BEGIN{max=0}{if($1>max){max=$1}}END{print max}' number
求單列記錄中最小值的列:awk -F'|' 'NR==1{min=$1}{if($1<min){min=$1}}END{print min}' number
5.2 多列記錄
以第一列為key,對應多個value,則取key對應的最大值和最小值:
最大值:awk -F'|' '{max[$1]=max[$1]>$2?max[$1]:$2}END{for(i in max){print i"|"max[i]}}' max_min
最小值:awk -F'|' '{if(!min[$1]){min[$1]=$2}else{min[$1]=min[$1]<$2?min[$1]:$2}}END{for(i in min){print i"|"min[i]}}' max_min