使用awk打印第一个字段和(并且仅)匹配记录中的字段

时间:2011-09-25 16:30:28

标签: python awk

我真的不知道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!

4 个答案:

答案 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
            }
        }
    }
'