最近遇到要处理两个文件的情况, 以前都是用awk处理一个文件的, 两个的还没遇到过,在网上找了下 :
QUOTE:1、用某一文件的一个域替换另一个文件中的的特定域? http://bbs.chinaunix.net/forum/viewtopic.php?t=500015文件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[Copy to clipboard] [ - ]CODE:awk 'BEGIN{OFS=FS=":"} NR==FNR{a[$1]=$2}NR>FNR{$2=a[$1];print}' shadow passwdNR==FNR,第一个文件shadow,以$1为下标,将$2的值赋给数组aNR>FNR,第二个文件passwd,将文件shadow$2的值赋值给文件passwd
其中:
NR是指已经处理的记录数目 FNR是指当前文件已经处理的记录数目 由于共有两个文件,所以当处理第一个文件的时候NR与FNR是相等的 处理第二个文件的时候NR是大于FNR的,此时的NR=文件一的记录数目+FNR
QUOTE: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[Copy to clipboard] [ - ]CODE:awk 'NR==FNR{a[substr($1,2,5)]=$2}NR>FNR&&a[b=substr($1,1,4)]{print $0, a[b]}' file2 file1 >file3QUOTE:3、如果文件a中包含文件b,则将文件b的记录打印出来http://bbs.chinaunix.net/forum/viewtopic.php?t=520411文件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/05766798607a[Copy to clipboard] [ - ]CODE:wk -F'[/,]' 'ARGIND==1{a[$0]}ARGIND>1{($2 in a);print $0}' b aawk -F'[/,]' 'NR==FNR{a[$0]}NR>FNR{($2 in a);print $0}' b aQUOTE: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=$igetline <"file2" for (i=1;iprintf $NF+a[NF] "\n"}' file1[Copy to clipboard] [ - ]CODE:awk '{for (i=1;i<=NF;i++) a[i]=$i;getline <"file2";for (i=1;iQUOTE:5、文件a1000 北京市 地级 北京市 北京市 1100 天津市 地级 天津市 天津市 1210 石家庄市 地级 石家庄市 河北省 1210 晋州市 县级 石家庄市 河北省 1243 滦县 县级 唐山市 河北省 1244 滦南县 县级 唐山市 河北省 b文件: 110000,北京市 120000,天津市 130000,河北省 130131,平山县 130132,元氏县 这样的字段 a中第二列在b中可能有可能没有,需要把有的匹配起来生成新的一列:要包含a和b的第一列。没有匹配的按照b原来的格式进行输出。[Copy to clipboard] [ - ]CODE:awk 'BEGIN{FS="[ |,]";OFS=","}NR<=FNR{a[$2]=$1}NR>FNR{print $1,$2,a[$2]}' a bQUOTE:6、file1的第一列与file2的第3列相同,file1的第二列与file2的第4列的3-5位相同,file1的第三列与file2的最后一列相同,# cat file1AAA 001 1000.00 BBB 001 2000.00 DDD 002 4000.00 EEE 002 5000.00 FFF 003 6000.00# cat file201 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[Copy to clipboard] [ - ]CODE:# 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}' file1 file2 01 1111 AAA WW001 $$$$ 1000.00 02 2222 BBB GG001 %%%% 2000.00 04 4444 DDD FF002 &&&& 4000.00 05 5555 EEE RR002 @@@@ 5000.00 06 666 FFF UU003 JJJJ 6000.00
转载自:http://xb9he.bokee.com/6410534.html
2008-10-22 12:47:46, 2515 reviews, comment
send to mailbox
Shell script to backup all MySQL database
【转载】命令的小总结
MySQL Innodb备份
shell中的数组
一些shell技巧
( ),{ }的区别
一个小命令
shell小技巧
Shell: 统计MySQL InnoDB表的大小
awk多维数组
继续凸墙 for Mac OS
json_formatter
少年,不点下广告吗!
all by shitou
blog comments powered by Disqus