【问题标题】:missing field and extra space after using for loop in awk在 awk 中使用 for 循环后缺少字段和额外空间
【发布时间】:2012-10-17 20:37:05
【问题描述】:

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

【问题讨论】:

    标签: awk


    【解决方案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 换行符结尾。要解决此问题,请在运行 awk 代码之前运行:dos2unix file.txt。或者,您可以设置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
    

    编辑:

    上面需要 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
    

    【讨论】:

    • 额外的空间是固定的,但我错过了最后一个字段。
    • 在“Final”之后的打印行末尾我什么都没有它是这样的Exam1:25 Exam2:39 Final
    • 我试着写一个脚本。看来我无法在脚本中运行 dos2unix
    • @femchi:您需要先在文件上运行dos2unix,然后再将其传递给awk。请查看我所做的编辑。 HTH。
    • @miono:感谢您对设置RS="\r\n" 的建议。我不知道为什么或谁拒绝了它,但它是一个优秀的。我会接受的!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多