You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Awk合并文件时歌手全名显示不全,请求排查脚本问题

解决awk合并多字段文本时丢失内容的问题

嘿,我来帮你分析下问题所在,以及怎么修复~

问题根源

你的awk脚本里处理file2.txt时,用了seen[$1]=$2来存储歌手名字,但awk默认是以空格作为字段分隔符的。比如file2.txt里的1 John Lennon会被拆成$1=1、$2=John、$3=Lennon,你只存了$2,自然只能看到歌手名的第一个单词啦!

修复后的脚本

我们需要把file2.txt中每个数字后面的所有字段都拼接起来作为歌手全名,然后再和file1.txt的内容合并。这里提供两种可行的写法:

写法一:用sub截取剩余内容

awk 'FNR==NR {
    # 复制当前行,然后去掉开头的数字和空格,剩下的就是完整歌手名
    full_name = $0
    sub(/^[^[:space:]]+ /, "", full_name)
    seen[$1] = full_name
    next
}
$1 in seen {
    # 将file1里的字母追加到对应数字的歌手名后面
    seen[$1] = seen[$1] " " $2
}
END {
    # 按数字升序遍历数组并输出,同时拼成一行
    for (i=1; i<=length(seen); i++) {
        if (i in seen) printf "%s %s ", i, seen[i]
    }
    print ""
}' file2.txt file1.txt

写法二:用循环拼接字段

awk 'FNR==NR {
    full_name = ""
    # 从第2个字段开始循环,拼接成完整歌手名
    for (i=2; i<=NF; i++) {
        full_name = full_name (i>2 ? " " : "") $i
    }
    seen[$1] = full_name
    next
}
$1 in seen {
    seen[$1] = seen[$1] " " $2
}
END {
    # 开启数字升序排序
    PROCINFO["sorted_in"] = "@ind_num_asc"
    # 遍历输出并拼成一行
    for (e in seen) {
        printf "%s %s ", e, seen[e]
    }
    print ""
}' file2.txt file1.txt

输出效果

运行上面的脚本后,就能得到你期望的结果:

1 John Lennon A 2 Mariah carey 3 Cool & The Gang C 4 Westlife 5 Red Hot Chili Peppers E

内容的提问来源于stack exchange,提问作者arieffirdaus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:17:44