在awk中使用for循环后缺少字段和额外空间

时间:2012-10-17 03:23:31

标签: awk

我需要使用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有问题吗?

1 个答案:

答案 0 :(得分: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的记录分隔符,以便它理解换行符结尾:

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

修改

以上要求默认情况下在FS上使用GNU awk,split()分割,因此不需要将其用作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