AWK保留输出中的标题

时间:2017-02-11 10:03:16

标签: unix awk

嗨,我有一个像这样的csv文件:

order,account,product
23023,Best Buy,productA
20342,Best Buy,productB
20392,Wal-Mart,productC

我正在使用前一个帖子的解决方案:

awk -F ',' '{ print > ("split-" $2 ".csv") }' dataset1.csv

但输出会生成2个没有标题的文件:

File1中

23023,Best Buy,productA
20342,Best Buy,productB

文件2

20392,Wal-Mart,productC

如何修改上面的awk解决方案以保留每个拆分文件中的标题行,以便输出类似于:

档案1

order,account,product
23023,Best Buy,productA
20342,Best Buy,productB

文件2

order,account,product
20392,Wal-Mart,productC

非常感谢!

3 个答案:

答案 0 :(得分:1)

我会这样写:

awk -F, '
    NR == 1 { header = $0; next}
    !($2 in files) {
        files[$2] = "split-" $2 ".csv"
        print header > files[$2]
    }
    { print > files[$2] }
' dataset1.csv

答案 1 :(得分:0)

您可以使用此awk脚本:

<强> script.awk

NR == 1 { header = $0; next}
        { fname = "split-" $2 ".csv"
        if( !( $2 in mem ) ) {
            print header > fname
            mem[ $2 ] = 1
        }
        print > fname 
        }

您可以像这样使用它:awk -F, -f script.awk dataset1.csv

<强>解释

  • 在读取脚本第一行中数据文件的第一个数据行时存储header
  • 对于其他数据行,脚本将header写入fname,但仅在第一次写入fname
  • 时写入
  • 这是通过在$2
  • 中存储mem来实现的

答案 2 :(得分:0)

另一个类似的awk

awk -F, 'NR==1 {h=$0; next} 
               {file="split-" $2 ".csv";  
                print (a[file]++?"":h ORS) $0 > file}' input

a[file]++是由输出文件名索引的行计数器,仅在第一行之前插入附加ORS的标题,这将成为每个拆分文件的标题。