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

相关文章
相关标签/搜索