1、用某一文件的一个域替换另一个文件中的的特定域?
文件passwd:
s2002408030068:x:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:x:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:x:529:529::/home/dz02/s2002408032823:/bin/pw
文件shadow:
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:12676:0:99999:7:::
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:12676:0:99999:7:::
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:12676:0:99999:7:::
用shadow文件中的密文部分替换passwd中的"x",生一个新passwd文件,如下所示
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:529:529::/home/dz02/s2002408032823:/bin/pw
awk 'BEGIN{OFS=FS=":"} NR==FNR{a[$1]=$2}NR>FNR{$2=a[$1];print}' shadow passwd
|
NR==FNR,第一个文件shadow,以$1为下标,将$2的值赋给数组a
NR>FNR,第二个文件passwd,将文件shadow$2的值赋值给文件passwd
2、 cat file1:
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401
cat file2:
I0011 11111
I0012 22222
I0014 55555
I0013 66666
规则:比较 file1的1-4字符 和 file2的2-5 字符,如果相同,将file2 的第二列 与 file1 合并 file3
0011AAA 200.00 20050321 11111
0012BBB 300.00 20050621 22222
0013DDD 400.00 20050622 66666
0014FFF 500.00 20050401 55555
awk 'NR==FNR{a[substr($1,2,5)]=$2}NR>FNR&&a[b=substr($1,1,4)]{print $0, a[b]}' file2 file1 >file3
|
3、如果文件a中包含文件b,则将文件b的记录打印出来
文件a:
10/05766798607,11/20050325191329,29/0.1,14/05766798607
10/05767158557,11/20050325191329,29/0.08,14/05767158557
文件b:
05766798607
05766798608
05766798609
通过文件a和文件b对比,导出这样的文件出来.
10/05766798607,11/20050325191329,29/0.1,14/05766798607
awk -F'[/,]' 'ARGIND==1{a[$0]}ARGIND>1{($2 in a);print $0}' b a awk -F'[/,]' 'NR==FNR{a[$0]}NR>FNR{($2 in a);print $0}' b a
|
4、file1文件内容
1 0.5 100
10 15 36.5
file2文件
50 10 9
3.2 1 5
将两个文件合成一个文件如:
51 10.5 109
13.2 16 41.5
就是对应的字段进行相加以后的数字。
awk '{for (i=1;i<=NF;i++) a
=$i
getline <"file2"
for (i=1;i" ";
printf $NF+a[NF] "\n"}' file1
awk '{for (i=1;i<=NF;i++) a[i]=$i;getline <"file2";for (i=1;i file1
|
5、
文件a
1000 北京市 地级 北京市 北京市
1100 天津市 地级 天津市 天津市
1210 石家庄市 地级 石家庄市 河北省
1210 晋州市 县级 石家庄市 河北省
1243 滦县 县级 唐山市 河北省
1244 滦南县 县级 唐山市 河北省
b文件:
110000,北京市
120000,天津市
130000,河北省
130131,平山县
130132,元氏县
这样的字段
a中第二列在b中可能有可能没有,需要把有的匹配起来生成新的一列:要包含a和b的第一列。没有匹配的按照b原来的格式进行输出。
awk 'BEGIN{FS="[ |,]";OFS=","}NR<=FNR{a[$2]=$1}NR>FNR{print $1,$2,a[$2]}' a b
|
6、
file1的第一列与file2的第3列相同,
file1的第二列与file2的第4列的3-5位相同,
file1的第三列与file2的最后一列相同,
# cat file1
AAA 001 1000.00
BBB 001 2000.00
DDD 002 4000.00
EEE 002 5000.00
FFF 003 6000.00
# cat file2
01 1111 AAA WW001 $$$$ 1000.00
02 2222 BBB GG001 %%%% 2000.00
03 3333 CCC JJ001 **** 3000.00
04 4444 DDD FF002 &&&& 4000.00
05 5555 EEE RR002 @@@@ 5000.00
06 666 FFF UU003 JJJJ 6000.00
07 777 III II005 PPPP 7000.00
08 8888 TTT TT008 TTTT 8000.00
# awk 'NR<=FNR{a[$1]=$1"x"$2"x"$3}
> NR>FNR{b=substr($4,3);c=$3"x"b"x"$6;if(c==a[$3]) print}
|
4.
文件的格式是这样的:
aaa aaaaaa
bbb bbbbbb
ccc cccccccc
aaa aaaaaaaaaaaa
ddd ddddddd
bbb bbbbbbbbbbbb
ccc cccccccccccccccc
ddd dddddddddddd
如何根据第一个字段的值找到对应行的内容,变成下面这个样子:
aaa aaaaaa
aaa aaaaaaaaaaaa
---------------------------------
bbb bbbbbb
bbb bbbbbbbbbbbb
---------------------------------
ccc cccccccc
ccc cccccccccccccccc
---------------------------------
ddd ddddddd
ddd dddddddddddd
# sort URFILE | awk '!a[$1]++&&NR!=1{print "-----------"}1'
sort后awk得到的输入是:
aaa aaaaaa
aaa aaaaaaaaaaaa
bbb bbbbbb
bbb bbbbbbbbbbbb
ccc cccccccc
ccc cccccccccccccccc
ddd ddddddd
ddd dddddddddddd
!a[$1]++是把a[$1]的值交给!,然后自加。
如果$1第一次出现,那么!a[$1]++的结果是:返回真,a[$1]自加成1;如果$1不是第一次出现,那么a[$1]非0,!a[$1]返回假,a[$1]自加。
因此只有$1第一次出现时,表达式!a[$1]++返回真。
NR!=1是为了不在第一行前做处理。
在a[$1]++&&NR!=1返回真时,print分割行"--------"。
最后的1相当于{if(true) print $0},即打印每一行的意思。
处理每一行的时候会先进行前面的判断,如果条件达成则输出分隔行。然后输出该行。
5. 打印某列以后的所有列的
awk '{ for(i=1; i<=2; i++){ $i="" }; print $0 }' urfile
阅读(794) | 评论(0) | 转发(0) |