收了本论坛的三个例子
引用: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
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}' file2 file1 >file3
引用: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/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<NF;i++) printf $i+a" ";
printf $NF+a[NF] "\n"}' file1
awk '{for (i=1;i<=NF;i++) a=$i;getline <"file2";for (i=1;i<NF;i++) printf $i+a" ";printf $NF+a[NF] "\n"}' 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}' 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
还有什么好例子,欢迎添加 :em03:
寂寞烈火 回复于:2005-07-14 01:18:43
学习~~~ :mrgreen:
mocou 回复于:2005-07-15 11:16:45
up
mymm 回复于:2005-07-18 17:46:41
很好!
学习ing!
killua 回复于:2005-08-02 13:28:44
i love it
herolyh 回复于:2005-08-02 17:36:54
awk 'BEGIN{OFS=FS=":"} NR==FNR{a[$1]=$2}NR>FNR{$2=a[$1];print}' shadow passwd
这段代码的意思我明白,就是对于数组的运用不太明白。a[$1]这是什么意思,数组怎么这样定义?数组使用的时候不需要定义什么吗?
herolyh 回复于:2005-08-03 12:52:04
怎么没有人回答我?
mocou 回复于:2005-08-03 13:26:45
a[s2002408030068]=$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1
a[s2002408032819]=$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0
a[s2002408032823]=$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.
herolyh 回复于:2005-08-03 17:34:48
mocou mm果然很厉害!!!!能不能告诉我你的qq,我有很多问题要请教!!!!
herolyh 回复于:2005-08-04 10:35:45
awk 'NR==FNR{a[substr($1,2,5)]=$2}NR>FNR&&a[b=substr($1,1,4)]{print $0, a}' file2 file1 >file3
这是什么意思?
shijiu 回复于:2005-09-15 11:02:00
好强!
welcome008 回复于:2005-09-15 14:08:42
这种功能好像和Awk的版本有关。另,如何看Awk的版本?
dingyi129 回复于:2005-09-15 14:12:28
awk -W version
waker 回复于:2005-09-15 14:12:38
POSIX
awk -W version
真的不能man 一下?
dingyi129 回复于:2005-09-15 14:21:11
引用:原帖由 "waker" 发表: POSIX
awk -W version
真的不能man 一下?
:em04:
welcome008 回复于:2005-09-15 14:28:45
awk -W不行,man了,里面没找到。另我的AWK是SUN5.8自带的
waker 回复于:2005-09-15 14:38:37
如果不是特别弱的程序,你输个错的选项,都会给你usage的
透明的鱼 回复于:2005-12-07 10:07:35
小弟也小试一下,望高手指点
现有两个文件 file1, file2
# cat file1
2005-12-06 10:15
---
2005-12-06 09:52 5863
2005-12-06 09:55 5180
2005-12-06 09:51 4373
2005-12-06 09:53 3970
2005-12-06 09:54 4420
2005-12-06 09:52 4714
2005-12-06 09:54 4487
2005-12-06 09:53 9079
2005-12-06 09:53 2858
2005-12-06 09:53 3045
2005-12-06 09:54 3031
2005-12-06 09:55 3128
2005-12-06 09:54 4361
2005-01-27 16:53 1934
2005-12-06 09:52 1645
2005-12-06 09:53 5801
2005-12-06 09:53 6417
2005-12-06 09:53 4180
2005-12-06 09:55 2221
2005-12-06 09:53 3678
# cat file2
2005-11-23 14:09
---
2005-11-23 10:20 3725
2005-11-23 10:22 3666
2005-11-23 10:19 3080
2005-11-23 10:21 2721
2005-11-23 10:22 3032
2005-11-23 10:20 3268
2005-11-23 10:21 3083
2005-11-23 10:21 5104
2005-11-23 10:21 1367
2005-11-23 10:21 1477
2005-11-23 10:22 1517
2005-11-23 10:22 1664
2005-11-23 10:21 2841
2005-01-14 17:20 1224
2005-11-23 10:20 995
2005-11-23 10:21 3550
2005-11-23 10:21 4042
2005-11-23 10:21 1671
2005-11-23 10:23 816
2005-11-23 10:21 2129
file1的第三列与file2的第三列相加
awk '{num[x++]=$3}; {getline < "file2"; num2[y++]=$3}; END {for (i=0; i<NR; i++) print i, num, num2, num+num2}' file2
i_amok 回复于:2005-12-08 10:46:06
第一个还可以用getline来做
file1:
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
s2002408032825:x:530:530::/home/dz02/s2002408032825:/bin/pw
s2002408032826:x:531:531::/home/dz02/s2002408032826:/bin/pw
s2002408032827:x:532:532::/home/dz02/s2002408032827:/bin/pw
s2002408032828:x:533:533::/home/dz02/s2002408032828:/bin/pw
s2002408032829:x:534:534::/home/dz02/s2002408032829:/bin/pw
s2002408032830:x:535:535::/home/dz02/s2002408032830:/bin/pw
s2002408032831:x:536:536::/home/dz02/s2002408032831:/bin/pw
s2002408032832:x:537:537::/home/dz02/s2002408032832:/bin/pw
s2002408032833:x:538:538::/home/dz02/s2002408032833:/bin/pw
s2002408032834:x:539:539::/home/dz02/s2002408032834:/bin/pw
s2002408032835:x:540:540::/home/dz02/s2002408032835:/bin/pw
s2002408032836:x:541:541::/home/dz02/s2002408032836:/bin/pw
s2002408032837:x:542:542::/home/dz02/s2002408032837:/bin/pw
s2002408032838:x:543:543::/home/dz02/s2002408032838:/bin/pw
file 2
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:::
s2002408032825:$1$Y80OYsw9$tLs00LMYB.3iXtkmWBMpS1:12676:0:99999:7:::
s2002408032826:$1$1rWMTTrf$tlZBdH/wm6iTew3abyrgt0:12753:0:99999:7:::
s2002408032827:$1$3fH16Z63$irguqltdV5wfOMtNE1u851:12676:0:99999:7:::
s2002408032828:$1$4rJAH5wg$ny5rMLPjhgatCZeE.X.AV.:12731:0:99999:7:::
s2002408032829:$1$u2YoRF.k$M/48rlcatDEndtX0GHiXa/:12676:0:99999:7:::
s2002408032830:$1$OC4KEc7A$k9IdiGN17DmiXFoSt2N6y/:12726:0:99999:7:::
s2002408032831:$1$QNHbN41/$kvczM/s/y43utdzLaeBRa1:12676:0:99999:7:::
s2002408032832:$1$75jz2Guw$Gqx/spna643z2jj7AnNgh0:12676:0:99999:7:::
s2002408032833:$1$nc4On2Gr$gAMbbyUzmaqJFhMMzotdj/:12676:0:99999:7:::
s2002408032834:$1$/kBQNLhR$.i2NYlJsASKziBVfC1RkJ1:12676:0:99999:7:::
s2002408032835:$1$WLreEyGj$ZYTvC9QhK1tOWG336edoU1:12676:0:99999:7:::
s2002408032836:$1$gwwa16SS$hmWziPfG3MmM94nTytniD1:12676:0:99999:7:::
s2002408032837:$1$4sRK6lFd$kUy1K5.E9SyeY2vDy2Iv..:12676:0:99999:7:::
s2002408032838:$1$y1rYmOzo$O4x.YFj.k..bki3hZa1CB1:12676:0:99999:7:::
要求把file 2的第二个子段插入到file 1的相应条目的第二个子段中
利用getline获取第二个文件的第二个字段,并且放到一个数组中。
awk script
BEGIN { while ((getline < "2") > 0){ lines[$1]=$2 };OFS=":" }
{
if($1 in lines){
$2=lines[$1]
print $0
}
}
运行方式
awk -F':' -f awk_script 1
运行结果
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
s2002408032825:$1$Y80OYsw9$tLs00LMYB.3iXtkmWBMpS1:530:530::/home/dz02/s2002408032825:/bin/pw
s2002408032826:$1$1rWMTTrf$tlZBdH/wm6iTew3abyrgt0:531:531::/home/dz02/s2002408032826:/bin/pw
s2002408032827:$1$3fH16Z63$irguqltdV5wfOMtNE1u851:532:532::/home/dz02/s2002408032827:/bin/pw
s2002408032828:$1$4rJAH5wg$ny5rMLPjhgatCZeE.X.AV.:533:533::/home/dz02/s2002408032828:/bin/pw
s2002408032829:$1$u2YoRF.k$M/48rlcatDEndtX0GHiXa/:534:534::/home/dz02/s2002408032829:/bin/pw
s2002408032830:$1$OC4KEc7A$k9IdiGN17DmiXFoSt2N6y/:535:535::/home/dz02/s2002408032830:/bin/pw
s2002408032831:$1$QNHbN41/$kvczM/s/y43utdzLaeBRa1:536:536::/home/dz02/s2002408032831:/bin/pw
s2002408032832:$1$75jz2Guw$Gqx/spna643z2jj7AnNgh0:537:537::/home/dz02/s2002408032832:/bin/pw
s2002408032833:$1$nc4On2Gr$gAMbbyUzmaqJFhMMzotdj/:538:538::/home/dz02/s2002408032833:/bin/pw
s2002408032834:$1$/kBQNLhR$.i2NYlJsASKziBVfC1RkJ1:539:539::/home/dz02/s2002408032834:/bin/pw
s2002408032835:$1$WLreEyGj$ZYTvC9QhK1tOWG336edoU1:540:540::/home/dz02/s2002408032835:/bin/pw
s2002408032836:$1$gwwa16SS$hmWziPfG3MmM94nTytniD1:541:541::/home/dz02/s2002408032836:/bin/pw
s2002408032837:$1$4sRK6lFd$kUy1K5.E9SyeY2vDy2Iv..:542:542::/home/dz02/s2002408032837:/bin/pw
s2002408032838:$1$y1rYmOzo$O4x.YFj.k..bki3hZa1CB1:543:543::/home/dz02/s2002408032838:/bin/pw
wayy2008 回复于:2005-12-19 11:40:37
文件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
CODE:[Copy to clipboard]awk -F'[/,]' NR==NFR{a[$0]}NR>;FNR{($2 in a);print $0}' b a
第3个例子我怎么试着不行呀,输出的时候是全部a文件,不是预想的只输出含有b文件的行。
[ 本帖最后由 wayy2008 于 2005-12-19 13:53 编辑 ]
大蚂蚁 回复于:2005-12-23 22:30:54
这个帖子不错,好象看一遍总是消化的不太好...
vickytjh 回复于:2005-12-27 16:40:44
1、用某一文件的一个域替换另一个文件中的的特定域?
我的理解:
OFS:输出字段分隔符(一个空行);
FS:字段分隔符(一个空行);
OFS=FS=“:”指OFS和FS都以“:”做为分隔符;
NR:当前记录的个数
FNR:和NR类似,但和当前文件相关。(没有理解)
NR==FNR{a[$1]=$2}:如果“NR=FNR”则,则a[s68]=NwFc,这是个关联数组;(我不知道它何时去读shadow,何时去读passwd,如果是靠NR==FNR来判断的,那我就没有真正的理解NR==FMR)
NR>FNR{$2=a[$1];
NR>FNR 怎么也不理解了
extend_asdfqwer 回复于:2006-02-16 09:54:50
顶楼上
西门子 回复于:2006-04-18 11:35:58
谁能给我讲讲,楼主的那个关于手机号码分配的例子啊 ,他写的语句我看不明白!!!!
awk 'BEGIN{FS="[ |,]";OFS=","}NR<=FNR{a[$2]=$1}NR>FNR{print $1,$2,a[$2]}' a b
^ ------------------------------------------^
这一部分
shitou9000 回复于:2006-04-18 12:27:51
开始仔细研究
webyuhang 回复于:2006-04-20 22:32:55
学习,楼主真牛!
shitou9000 回复于:2006-04-23 09:49:05
在第2个例子中
awk 'NR==FNR{a[substr($1,2,5)]=$2}NR>FNR&&a[b=substr($1,1,4)]{print $0, a}' file2 file1
&&代表与的意思。也就是说。NR>FNR 与 a[b=substr($1,1,4)] 如果吧 file2中$2的一个改为00000这个就会给出错误的结果。
cat file1:
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401
cat file2:
I0011 11111
I0012 00000
I0014 55555
I0013 00000
希望给每个例子一个新解。
第三个例子
awk 'NR==FNR{a[$1]=$1}NR>FNR{for (i in a) {if(match($0,i)) print $0}}' b a
第四个例子
awk 'NR==FNR{for(i=1;i<=NF;i++) a=$i}NR>FNR{for(i=1;i<=NF;i++) $i+=a;print $0}' a b
[ 本帖最后由 shitou9000 于 2006-4-24 10:58 编辑 ]
bangbangbing 回复于:2006-09-04 23:11:49
辛苦
_Erics 回复于:2006-09-13 15:01:36
引用:原帖由 西门子 于 2006-4-18 11:35 发表
谁能给我讲讲,楼主的那个关于手机号码分配的例子啊 ,他写的语句我看不明白!!!!
awk 'BEGIN{FS="[ |,]";OFS=","}NR<=FNR{a[$2]=$1}NR>FNR{print $1,$2,a[$2]}' a b
...
NR是指已经处理的记录数目
FNR是指当前文件已经处理的记录数目
由于共有两个文件,所以当处理第一个文件的时候NR与FNR是相等的
处理第二个文件的时候NR是大于FNR的,此时的NR=文件一的记录数目+FNR
hahaghost 回复于:2006-12-29 10:51:56
这个帖子保存消化了好多天啊好多天~~
tanyear 回复于:2006-12-29 12:56:03
没有解释,遗憾
huangd 回复于:2006-12-29 17:40:59
骇客级的,呵呵,佩服
|