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