2016-12-04 63 views
4

我需要打印一个文件的内容,并为每一列赋予一个标题,留下足够的空间以便读取,然后我需要将其输出到一个新文件中。我遵循这个教程很长一段时间,但我已经陷入困境。Linux Awk帮助代码

http://www.thegeekstuff.com/2010/01/awk-introduction-tutorial-7-awk-print-examples

这是他们所使用的示例代码,这将使我正是我需要用我做的。但是当我调整它时它不起作用。

$ awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";} 
{print $2,"\t",$3,"\t",$4,"\t",$NF;} 
END{print "Report Generated\n--------------"; 
}' employee.txt 

这是我的,不像这个例子,我想打印整个文档,并不真正想要这个“报告生成”废话下。我试着在结束后添加{print;}',并确保开始一个新行,并且......什么也不做。

$ awk 'BEGIN {Print "Firstname\tLastname\tPoints";} END > awktest.txt > done 

我哪里出错了?它不断给我的反应源线2

+0

您正在错失报价;如果你不想在文件末尾做任何事情,你不需要'END'地址; '> awktest.txt> done'部分没什么意义。 – mustaccio

+0

没有关闭'''。我假设你的shell正在等待你输入你在'awk'之后开始的字符串的其余部分,然后'''。 – melpomene

+0

编写awk教程的人需要参加awk教程。忽略它,它充满了无稽之谈,并会让你走错了路。阅读Arnold Robbins编写的“有效的Awk编程”第4版。 –

回答

1

要删除的footline,刚刚辍学任何从开始至结束的结束“:

awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";} {print $2,"\t",$3,"\t",$4,"\t",$NF;}' employee.txt 

在你的第二个例子,你离开了结束的”,我怀疑你把一个“>”比需要的多一个:“

awk 'BEGIN {print "Firstname\tLastname\tPoints";}' awktest.txt > done 

后面的例子会默默地忽略从”awktest.txt“中读取的所有内容。

+0

这只会打印标题,而不是数据。 – e0k

+0

@ e0k哪一个?第一个例子,或第二个已经说过会忽略输入文件的例子? – melpomene

+0

是的,第二个(没有每个记录子句并且只有一个'BEGIN'子句的)不会列出任何数据,但是它确实表明了这一点。您可能希望在'BEGIN'子句中使用'OFS =“\ t”',而不必在'print'语句中列出所有''\ t“'。 – e0k

0

看来你已经错过了的列和源文件的实际打印,还我读了你不需要任何最终行动...

awk 'BEGIN {Print "Firstname\tLastname\tPoints";} END > awktest.txt > done` 

应该是...

awk 'BEGIN {Print "Firstname\tLastname\tPoints";}{print $1,"\t",$2,"\t",$3;}' source_file.txt > awktest.txt` 

只要记住要将$ 1,$ 2,$ 3更改为您需要的源文件上的哪些列。

仅供参考。我不是专家,只是读了TUTS :)

0

看起来你需要的只是插入一个标题行,它可以很容易地与sed做了什么(以及awk)或cat

$ sed '1iFirstname\tLastname\tPoints' file > output.file 

$ awk 'BEGIN{print "Firstname\tLastname\tPoints"} 1' file > output.file 

$ cat <(echo -e "Firstname\tLastname\tPoints") file > output.file 
0

awk打印功能被命名为print,而不是Print。 idk为什么所有解决方案都在其打印报表中包含,"\t",。你不希望这样 - 你想在脚本开始时设置-v OFS='\t',然后在字段之间使用,。所有你想要的是:

awk -v OFS='\t' ' 
BEGIN {print "Name", "Designation", "Department", "Salary"} 
{print $2, $3, $4, $NF} 
}' employee.txt 

假设这些是你想从你的数据打印的正确的字段号码。您问题中的示例输入/输出对帮助我们回答它非常有用。