akw擴展

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

相關文章
相關標籤/搜索