Csv awk,标题:阅读时为igore,写入时为include

Csv awk,标题:阅读时为igore,写入时为include,csv,awk,Csv,Awk,我知道在读取文件时如何忽略列标题。我可以这样做: awk 'FNR > 1 { #process here }' table > out_table 但是如果我这样做,除了列标题之外的所有内容都会写入输出文件。但我希望输出文件也有列标题 当然,在执行第一条语句后,我可以这样做: awk 'BEGIN {print "Column Headers\t"} {print}' Out_table > out_table_with_header 但这变成了一个两步的过程。那么,有没

我知道在读取文件时如何忽略列标题。我可以这样做:

awk 'FNR > 1 { #process here }' table > out_table
但是如果我这样做,除了列标题之外的所有内容都会写入输出文件。但我希望输出文件也有列标题

当然,在执行第一条语句后,我可以这样做:

awk 'BEGIN {print "Column Headers\t"} {print}' Out_table > out_table_with_header
但这变成了一个两步的过程。那么,有没有一种方法可以在单步中实现这一点呢


简而言之,有没有一种方法可以让我在读取文件时忽略列标题,对数据执行操作,然后在将列标题写入输出文件时包含列标题,只需一个步骤(或者一个步骤块,需要的响应时间非常少?)

不确定我是否正确获得了您的答案,您可以简单地:

awk 'NR==1{print}; NR>1 { # process }' file
可简化为:

awk 'NR==1; NR>1 { # process }' file
这适用于单个输入文件


如果要处理多个文件,请在第1行使用相同的列标题:

awk 'FNR==1 && !h {print; h=1}; FNR>1 { # process }' file1 file2 ...

我正在使用变量
h
检查标题是否已经打印。

您的
BEGIN{}{}
是为而设计的,几乎不需要花费时间,并且由于您的conditional输出,有一个条件块(代码)。现在,您可以使用一个简单的bloc
{#some process;print$1$2}
来打印标题和内容,但这取决于您可以更改标题内容的操作。不要测试相反的条件-
awk'NR==1{print;next}{{#process}文件