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

发布于 2024-12-06 12:56:46 字数 887 浏览 1 评论 0原文

我真的不知道 awk 是否适合该任务......也许 python 中的东西会更好。无论如何,我想先在这里询问任务的可行性。我们开始:

数据:

###

offspr84 175177 200172 312312 310326 338342 252240 226210 113129 223264
男28 197175 172200 308312 310338 262338 256252 190226 113129 223219
女13 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
Female17 181177 160172 280312 362346 350326 230238 126178 129129 223167

###

所以基本上我需要打印第一个字段($1)并在第一条记录中匹配(粗体)$9,并在第二条记录中匹配$2和$6。

输出文件:
offspr84 113129
男28 113129

offspr85 181177
女17 181177

offspr85 358330
male65 358330

有什么关于我如何实现这一目标的提示吗?

谢谢!

I really don't know if awk would be the appropriate tool for that task... Maybe something in python would be better. Anyway, I thought asking here first for the feasibility of the task. Here we go :

Datas :

###

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

###

So basicaly I need to print the first field ($1) and matching (in bold) $9 in the first record and matching $2 and $6 in second record.

Output file :
offspr84 113129
male28 113129

offspr85 181177
female17 181177

offspr85 358330
male65 358330

Any hint on how I could accomplish that ?

Thanx !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

演多会厌 2024-12-13 12:56:46

该代码将产生您想要的输出。也许不是最好的方法,但似乎按预期工作。

#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

This code will produce the output you want. Maybe not the best way, but seems to work as expected.

#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

Update:

With a nested list to include both list at once:

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
贵在坚持 2024-12-13 12:56:46

我不完全确定您希望匹配如何进行。但假设相同的模式应用于所有字段,您可以通过循环字段轻松地做到这一点,例如

{
    for(i=2; i<=NF; i++) {
        if (match($i, "some regexp")) {
            print $1 $i
        }
    }
}

I'm not entirely sure on how you want the matching to work. but assuming the same pattern is applied to all fields, you can easily do this by looping over the fields e.g

{
    for(i=2; i<=NF; i++) {
        if (match($i, "some regexp")) {
            print $1 $i
        }
    }
}
戴着白色围巾的女孩 2024-12-13 12:56:46

试试这个 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

try this awk code

 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
她如夕阳 2024-12-13 12:56:46
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
            }
        }
    }
'
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
            }
        }
    }
'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文