将输入文件分成三列并按第三列排序

将输入文件分成三列并按第三列排序

到目前为止,我的脚本(script.sh)为:

#!/bin/bash/

BEGIN {  
        print "Author    Name of Book     ISBN"  
        print "------    ------------     ----"  
}  
{ printf "%-9s &s\n", 1$, 2$, 3$ }  
END  

然后我运行命令:

sort -k 3,3 INPUTFILE.INPUT | awk -f script.sh  

上面的内容都没有按需要工作。

另请注意,输入文件的数据以逗号分隔。我还必须使用“循环”,我希望 awk 命令正在这样做。

答案1

这里有一些问题,一些会产生错误,另一些只是拼写错误或误解的结果:

  1. -行#!可以删除,或者应该说

    #!/usr/bin/awk -f
    

    awk(或者您系统上的任何位置)。使用上面的#!-line,您不必awk -f在命令行上调用脚本,但可以./script.awk直接使用(如果它是可执行的)。如果没有#!-line,则需要awk -f在命令行上使用。

  2. 要引用输入数据中特定字段中的值,请使用$nwheren是您所引用的字段编号,而不是n$

  3. 格式化printf字符串只有一个格式占位符,但您为其提供了三段数据。它的参数周围也没有括号。

  4. END块可以被移除。

  5. 如果输入具有字段分隔符,例如,|,而不是在空白(空格或制表符)上分隔,则必须awk使用 例如awk -F ','或来说明这一点awk -F '|',或者通过将变量设置FS为块中的适当字符来说明这一点BEGIN。否则脚本将错误地分割输入记录。

这给我们留下了脚本 ( script.awk):

BEGIN {
    fmt = "%-15s\t%-15s\t%-15s\n"
    printf(fmt, "Author", "Name of Book", "ISBN")  
    printf(fmt, "------", "------------", "----")  
}

{ printf(fmt, $1, $2, $3) }

我冒昧地引入了一个格式字符串,它将三个制表符分隔字段中的每一个字段格式化为左对齐字符串。每个字段都有 15 个字符的空间。您可以通过更改块来轻松调整fmtBEGIN

调用将是

sort -t ',' -k 3,3 INPUTFILE.INPUT | awk -F ',' -f script.awk

这里,假设文件中的数据以逗号分隔(并且命令sort已相应更改)。

相关内容