1、使用shell变量
cat filename
1111111:13443253456
2222222:13211222122
1111111:13643543544
3333333:12341243123
2222222:12123123123
使用awk设置为:
[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123
[root@centos7 shell]# sort -n filename |awk -F ':' '{print $1}'|uniq > id.txt
[root@centos7 shell]# for id in `cat id.txt`;do echo "[$id]"; awk -v id2="$id" -F ':' '$1==id2 {print $2}' filename ; done
总结:awk -v 指将$id的值设置为id2
2、我有这样的需求,需要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容如下
cat 1.txt
1 linux
2 os
3 op
4 se
cat 2.txt
1 dba
2 opm
3 pc
4 de
5 df
合并后的结果为:
1 linux dba
2 os opm
3 op pc
awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 1.txt 2.txt
解释:NR表示行号,FNR也表示行号;区别是读一个文本文件都是一样的,当读第二个文本文件时NR就继续累积,而FNR就清空之前的,变为了从1开始读取。
当NR==FNR时就是读取的1.txt,a[$1]表示一个数组,$2就是linux、os这些。当NR>FNR时将读取第二个文件2.txt,这时,print $0就是读取的第二个文件的内容,第三列就是指的a[$1]就是在1.txt中定义的$2的值
3、将一个文件多行写成一行
第一种:a=`cat file`;echo $a
第二种:cat file|xargs
4、gsub函数使用
awk 'gsub(/www/,"abc")' /etc/passwd // passwd文件中把所有www替换为abc
awk -F ':' 'gsub(/www/,"abc",$1) {print $0}' /etc/passwd // 替换$1中的www为abc
5、查找多行
grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行
egrep '123|abc' filename //用egrep同样可以实现
awk '/123|abc/' filename // awk 的实现方式
6、paste 用法
paste filename1 filename2
这样就可以实现了。举个例子。
cat a.txt
1 2 3
4 5 6
a b c
cat b.txt
3 2 1
6 5 4
c b a
则 paste a.txt b.txt 结果为
1 2 3 3 2 1
4 5 6 6 5 4
a b c c b a
如果,你想在两个文件连接处用一个指定的字符连接,还可以用-d来指定
paste -d '+' a.txt b.txt
结果为
1 2 3+3 2 1
4 5 6+6 5 4
a b c+c b a
7、NF:域数,NR:当前行数
[root@test shell]# awk -F ':' '{print NR,"$"NF"="$NF}' /etc/passwd
1 $7=/bin/bash
2 $7=/sbin/nologin
3 $7=/sbin/nologin
4 $7=/sbin/nologin
5 $7=/sbin/nologin
6 $7=/bin/sync
8、查找多个
grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行
egrep '123|abc' filename //用egrep同样可以实现
awk '/123|abc/' filename // awk 的实现方式