1

我需要使用 awk 脚本从文件中提取一些信息。我有一个包含 11 个字段的标题行,我将其拆分为一个名为titleList.

Student Number:Name:Lab1:Lab2:Lab3:Lab4:Lab5:Lab6:Exam1:Exam2:Final

找到合适的行后,我需要打印按标题进行的字段,例如,如果结果是:

92839342:Robert Bloomingdale:9:26:18:22:9:12:25:39:99

我必须以这种方式打印它:

Student Number:92839342 Name:Robert Bloomingdale Lab1:9 Lab2:26 Lab3:18
Lab4:22 Lab5:9 Lab6:12 Exam1:25 Exam2:39 Final:99

我使用 for 循环来管理它:

for (i=0 ;i<=NF ;i++)
{
    printf "%s %s %s %s",titleList[i],":",$i," "
}

一切看起来都不错,除了有两个问题的结果:首先,每个结果之间有一个额外的空格,其次,搜索行的最后一个字段丢失

    Student Number : 92839342  Name : Robert Bloomingdale  Lab1 : 9  Lab2 : 26
    Lab3:18  Lab4 : 22  Lab5 : 9  Lab6 : 12  Exam1 : 25  Exam2 : 39  Final 

我该怎么办?\n搜索结果末尾有什么问题吗?

4

1 回答 1

1

您可以通过更正printf语句来更正字段之间的额外空格量:

awk -F ":" 'NR == 1 { split($0, array, FS) } NR >= 2 { for (i=1; i<=NF; i++) printf "%s:%s ", array[i], $i; printf "\n" }' file.txt

内容file.txt

Student Number:Name:Lab1:Lab2:Lab3:Lab4:Lab5:Lab6:Exam1:Exam2:Final
92839342:Robert Bloomingdale:9:26:18:22:9:12:25:39:99

结果:

Student Number:92839342 Name:Robert Bloomingdale Lab1:9 Lab2:26 Lab3:18 Lab4:22 Lab5:9 Lab6:12 Exam1:25 Exam2:39 Final:99

编辑:

此外,您缺少最后一个值,因为您正在使用的文件可能具有 Windows 换行符结尾。要解决此问题,请在运行代码dos2unix file.txt之前运行:。awk或者,您可以设置awk's 记录分隔符,以便它理解换行符结尾:

awk 'BEGIN { RS="\r\n"; FS=":" } NR == 1 { split($0, array, FS) } NR >= 2 { for (i=1; i<=NF; i++) printf "%s:%s ", array[i], $i; printf "\n" }' file.txt

编辑:

以上需要 GNU awk,split() 默认在 FS 上拆分,因此不需要将其用作 arg,通常使用 "next" 而不是指定相反的条件,并且通常使用 print "" 而不是 printf " \n" 所以你使用 ORS 设置而不是在输出语句中硬编码它的值。因此,应将上述内容调整为:

gawk 'BEGIN { RS="\r\n"; FS=":" } NR == 1 { split($0, array); next } { for (i=1; i<=NF; i++) printf "%s:%s ", array[i], $i; print "" }' file.txt
于 2012-10-17T03:34:59.410 回答