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