请教一个awk的问题

2013-10-24 15:47:29 +08:00
 jseanj
数据文件如下:
[id=123] key=a
[id=456] key=b
[id=789] key=c
[id=123] value=aa
[id=456] value=bb

如果我想通过a来找到aa,应该如何做?

ps:我的思路是找到a的那一行,取出“id=123”,然后作为接下来查找的变量,这样就能找到“[id=123] value=aa”这一行,但是不知道该怎样保存中间变量并用于接下来的查找。
2943 次点击
所在节点    程序员
10 条回复
merlin852
2013-10-24 16:13:38 +08:00
awk '/key=a/{a=$1;next}{if($1==a)print $2}'
ry_wang
2013-10-24 16:17:18 +08:00
awk '{ split($1,x,"="); gsub("]","",x[2]); ID=x[2]; ARRAY[ID]=ARRAY[ID]" "$2 } END {for(i in ARRAY) print i" "ARRAY[i]}' hello.txt

ARRAY这个数组楼主随意处理了
e1443367
2013-10-24 16:58:14 +08:00
复杂些的操作,更适合由表达能力更强的脚本语言做,比如python
sykp241095
2013-10-24 17:29:26 +08:00
cat datafile | sort -k1 | awk '$1==o{print v, $0}{o=$1;v=$0}'
wang2191195
2013-10-24 17:37:27 +08:00
其实你只要把awk脚本写在文件里面 你就会发现好处理多了
bjtugun
2013-10-24 18:06:22 +08:00
join命令,记得感谢我:)
black0144
2013-10-24 18:19:06 +08:00
@bjtugun Usage: join [OPTION]... FILE1 FILE2,得俩文件才行的。。
rrfeng
2013-10-24 21:38:31 +08:00
顺序很关键。
plprapper
2013-10-24 21:51:19 +08:00
awkjoin(){
sep=$1
ia=$2
ib=$3
fap=$4
fbp=$5
all='$0'
awk -F"${sep}" "NR==FNR{map[$ia]=$all;}NR>FNR{map[$ib]=map[$ib] \"\002\" $all;}END{for(line in
map){print map[line]}}" $fap $fbp
}

酌情自己修正
iptux
2013-10-24 22:57:36 +08:00
数据文件为什么不是长成这个样子
[id=123] a=aa
[id=456] b=bb
[id=789] c=cc

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/86773

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX