使用awk打印记录中的第一个字段和匹配字段
我其实不太确定用awk工具来完成这个任务是否合适……也许用python会更好。不过,我想先在这里问一下这个任务的可行性。下面是数据:
数据:
###offspr84 175177 200172 312312 310326 338342 252240 226210 113129 223264
male28 197175 172200 308312 310338 262338 256252 190226 113129 223219
female13 197177 172172 312308 318326 342350 240248 210218 129113 267247
offspr85 181177 192160 320312 290362 358330 238238 214178 133129 263223
male65 197181 176192 320268 322286 358330 238244 206214 137133 267263
female17 181177 160172 280312 362346 350326 230238 126178 129129 223167
基本上,我需要打印出第一行的第一个字段($1)和第九个字段中匹配的(加粗的)内容,以及第二行中第二个字段和第六个字段的匹配内容。
输出文件:
offspr84 113129
male28 113129
offspr85 181177
female17 181177
offspr85 358330
male65 358330
有没有什么提示可以帮我完成这个任务呢?
谢谢!
4 个回答
我不太确定你想要的匹配方式是什么。不过假设你想对所有字段都用相同的规则来匹配,你可以通过循环这些字段来轻松实现,比如这样:
{
for(i=2; i<=NF; i++) {
if (match($i, "some regexp")) {
print $1 $i
}
}
}
试试这个awk代码
awk '/###/{i++;next}
i==1{if($0~/offspr84/){
a=$9;n=$1;next;
}
if($9==a){print n,a;print $1,$9}}
i==2{if($0~/offspr85/){
m=$1;p=$2;q=$6;next;}
if($2==p){print m,p;print $1,p}
if($6==q){print m,q;print $1,q}
}' yourFile
这段代码会产生你想要的输出。可能不是最好的方法,但看起来效果是符合预期的。
#data = [
#'offspr84 175177 200172 312312 310326 338342 252240 226210 113129 223264',
#'male28 197175 172200 308312 310338 262338 256252 190226 113129 223219',
#'female13 197177 172172 312308 318326 342350 240248 210218 129113 267247']
data = [
'offspr85 181177 192160 320312 290362 358330 238238 214178 133129 263223',
'male65 197181 176192 320268 322286 358330 238244 206214 137133 267263',
'female17 181177 160172 280312 362346 350326 230238 126178 129129 223167' ]
for i, line in enumerate(data):
data[i] = line.split(' ')
for item in data[0]:
if data[1].count(item) > 0:
print data[0][0], item
print data[1][0], item
if data[2].count(item) > 0:
print data[0][0], item
print data[2][0], item
更新:
使用一个嵌套列表可以同时包含两个列表:
datas = [[
'offspr85 181177 192160 320312 290362 358330 238238 214178 133129 263223',
'male65 197181 176192 320268 322286 358330 238244 206214 137133 267263',
'female17 181177 160172 280312 362346 350326 230238 126178 129129 223167' ],
[
'offspr84 175177 200172 312312 310326 338342 252240 226210 113129 223264',
'male28 197175 172200 308312 310338 262338 256252 190226 113129 223219',
'female13 197177 172172 312308 318326 342350 240248 210218 129113 267247']
]
for data in datas:
for i, line in enumerate(data):
data[i] = line.split(' ')
for data in datas:
for item in data[0]:
if data[1].count(item) > 0:
print data[0][0], item
print data[1][0], item
if data[2].count(item) > 0:
print data[0][0], item
print data[2][0], item