awk -v 定义参数 A=44echo "ABCD" |awk -v GET_A=$A ’{print GET_A}
说明:-v选项用于定义参数,这里表示将变量A的值赋予GET_A。
有多少个变量须要赋值,就须要多少个-v选项。与之等价的:应用于脚本中:html
#! /bin/bash sort -n filename |awk -F ':' '{print $1}'|uniq >id.txt for id in `cat id.txt`; do echo "[$id]" awk -v id2=$id -F ':' '$1==id2 {print $2}' filename // 另外的方式为: awk -F ':' '$1=="'id'" {print $2}' filename done
附件:vim
cat filename 1111111:13443253456 2222222:13211222122 1111111:13643543544 3333333:12341243123 2222222:12123123123
运行脚本后结果为:数组
[1111111] 13443253456 13643543544 [2222222] 13211222122 12123123123 [3333333] 12341243123
[root@test-131 scripts]# vim filename.sh #!/bin/bash sort -n filename.txt|awk -F ':' '{print $1}'|uniq >id.txt for i in `cat id.txt` do echo "[$i]" awk -F ':' '$1=='$i' {print $2}' filename.txt done
结果bash
[root@test-131 scripts]# sh filename.sh [1111111] 13443253456 13643543544 [2222222] 13211222122 12123123123 [3333333] 12341243123
我有这样的需求,须要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容以下code
cat 1.txt 1 aa 2 bb 3 ee 4 ss cat 2.txt 1 ab 2 cd 3 ad 4 bd 5 de
合并后的结果为:htm
1 ab aa 2 cd bb 3 ad ee 4 bd ss 5 de
实现的命令为:
awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 1.txt 2.txtblog
解释:NR表示读取的行数, FNR表示读取的当前行数,你们能够运行这个命令
awk '{print NR,FNR}' 1.txt 2.txt,比较NR和FNR
因此其实NR==FNR 就表示读取1.txt的时候。 同理NR>FNR表示读取2.txt的时候
数组a其实就至关于一个mapip
本身先写的一个脚本,好像结果有一点点不同get
#!/bin/bash cat 1.txt 2.txt|awk '{print $1}'|sort -n|uniq >12.txt for i in `cat 12.txt` do a=`awk '{if ($1=='$i') print $2}' 1.txt` b=`awk '{if ($1=='$i') print $2}' 2.txt` echo "$i $a $b" done
结果:test
[root@test-131 scripts]# sh 12.sh 1 aa ab 2 bb cd 3 ee ad 4 ss bd 5 de
NR==FNR
awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 1.txt 2.txt
[root@test-131 scripts]# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 1.txt 2.txt 1 ab aa 2 cd bb 3 ad ee 4 bd ss 5 de
我的理解:
NR==FNR 读取第一个文件
NR>FNR 读取第二个文件
awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 1.txt 2.txt 分为两部分:
第一分部:NR==FNR{a[$1]=$2}
读取文件1.txt
a[1]=aa
a[2]=bb
a[3]=ee
第二部分:NR>FNR{print $0,a[$1]} ($0,$1是文件2中的)
读取文件2.txt
$0=$1,$2===>1 ab
a[$1]=aa
$0,a[$1]====>1 ab aa
....
列2:
[root@test-131 scripts]# cat a 张三|000001 李四|000002 [root@test-131 scripts]# cat b 000001|10 000001|20 000002|30 000002|15
实现效果:
[root@test-131 scripts]# awk -F "|" 'NR==FNR{a[$2]=$0}NR>FNR{print a[$1]"|"$2}' a b 张三|000001|10 张三|000001|20 李四|000002|30 李四|000002|15
我的理解:
第一部分:NR==FNR{a[$2]=$0}
a[000001]=张三|000001
a[000002]=李四|000002
第二部分:NR>FNR{print a[$1]"|"$2} (这里的变量$1,$2是文件b中的)
a[000001]=张三|000001
$2=10
print a[$1]"|"$2====>张三|0000001|10
依次打印
转: http://www.javashuo.com/article/p-rdbrmgnl-bz.html
a=cat file
;echo $a
awk '{printf("%s ",$0)}' file // %s 后记得要有一空格,不然出来就是彻底连在一块儿的,中间连空格都没有
cat file |xargs
[root@test-131 scripts]# cat 3.txt|xargs 1 2 3 4 5 6 [root@test-131 scripts]# awk '{printf("%s ",$0)}' 3.txt 1 2 3 4 5 6 [root@test-131 scripts]#
awk 'gsub(/www/,"abc")' /etc/passwd // passwd文件中把全部www替换为abc awk -F ':' 'gsub(/www/,"abc",$1) {print $0}' /etc/passwd // 替换$1中的www为abc