awk中split函数将整串存入数组下标1的问题求助
解决AWK中split函数未正确拆分字符串的问题
首先咱们得先理清问题根源:你当前的脚本逻辑里,names=$1已经是单个无空格的名字(比如第一组的mona),用split(names, nameArray, " ")去拆分一个本身就没有空格的字符串,结果自然只有nameArray[1]等于这个名字——这不是split的问题,是你传给split的变量根本不是需要拆分的多内容字符串。
再看你的输入文件:一行内连续存储了多个学生的信息,每个学生由「1个名字 + 4个成绩」组成(比如mona 70 77 85 77是第一个学生,紧接着john 85 92 78 80是第二个,以此类推)。你的核心需求应该是逐个提取每个学生的名字和成绩,而不是拆分单个名字。
正确的解决方案:遍历字段分组处理
我们可以通过遍历整行的字段,每5个字段为一组来处理一个学生,代码如下:
BEGIN { FS = " " # 提前在BEGIN块设置字段分隔符,避免每行重复设置 } { # 每5个字段对应一个学生,循环遍历所有学生 for (i = 1; i <= NF; i += 5) { name = $i # 当前学生的名字 vi1 = $(i + 1) # 第一个成绩 vi2 = $(i + 2) # 第二个成绩 vi3 = $(i + 3) # 第三个成绩 rv = $(i + 4) # 第四个成绩 # 按需求输出,这里用制表符分隔,也可以调整格式 printf("%s\t%s\t%s\t%s\t%s\n", name, vi1, vi2, vi3, rv) # 如果需要计算平均分等额外操作,也可以在这里添加 # avg = (vi1 + vi2 + vi3 + rv) / 4 # printf("%s\t%.2f\n", name, avg) } }
关于split函数的正确用法(补充说明)
如果你确实需要拆分一个包含空格的字符串(比如名字是带空格的Mary Ann),那要确保传给split的变量本身包含分隔符。举个例子:
{ fullName = "Mary Ann" split(fullName, nameArr, " ") printf("First name: %s, Last name: %s\n", nameArr[1], nameArr[2]) }
这种情况下split才会把字符串拆分成多个数组元素,而你的原脚本中names=$1没有空格,所以split后数组只有一个元素是完全正常的。
运行方式
保存修改后的脚本为grades.awk,然后执行命令:
awk -f grades.awk your_input_file.txt
内容的提问来源于stack exchange,提问作者user7582348
相关产品推荐
相关产品推荐

