使用awk打印记录中的第一个字段和匹配字段

0 投票
4 回答
569 浏览
提问于 2025-04-17 03:03

我其实不太确定用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 个回答

0

我不太确定你想要的匹配方式是什么。不过假设你想对所有字段都用相同的规则来匹配,你可以通过循环这些字段来轻松实现,比如这样:

{
    for(i=2; i<=NF; i++) {
        if (match($i, "some regexp")) {
            print $1 $i
        }
    }
}
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
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

撰写回答