我真的不知道awk是否适合该任务...也许python中的东西会更好。无论如何,我想先在这里问这个任务的可行性。我们走了:
数据:
### offspr84 175177 200172 312312 310326 338342 252240 226210 113129 223264
男28 287175 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
男性65 197181 176192 320268 322286 358330 238244 206214 137133 267263
女17 181177 160172 280312 362346 350326 230238 126178 129129 223167
所以基本上我需要在第一个记录中打印第一个字段($ 1)和匹配(以粗体显示)$ 9,并在第二个记录中匹配$ 2和$ 6。
输出文件:
offspr84 113129
male28 113129
offspr85 181177
female17 181177
offspr85 358330
男65 658330
有关如何实现这一目标的任何提示?
Thanx!
答案 0 :(得分:1)
此代码将生成您想要的输出。也许不是最好的方式,但似乎按预期工作。
#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
答案 1 :(得分:0)
我不完全确定您希望匹配如何工作。但假设相同的模式应用于所有字段,您可以通过循环遍历字段来轻松完成此操作,例如
{
for(i=2; i<=NF; i++) {
if (match($i, "some regexp")) {
print $1 $i
}
}
}
答案 2 :(得分:0)
试试这个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
答案 3 :(得分:0)
awk '
/^offspr/ {
for (i=1; i<=NF; i++) {
offspr[i] = $i
}
next
}
{
for (i=2; i<=NF; i++) {
if ($i == offspr[i]) {
print offspr[1] " " offspr[i]
print $1 " " $i
print ""
break
}
}
}
'