使用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
相关产品推荐
相关产品推荐

