【问题标题】:AWK Preserve Header in OutputAWK 在输出中保留标题
【发布时间】:2017-06-29 16:47:17
【问题描述】:

您好,我有一个这样的 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 个没有标题的文件:

文件1

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

非常感谢!

【问题讨论】:

    标签: unix awk


    【解决方案1】:

    你可以使用这个 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 中来实现的

    【讨论】:

    • 对我不起作用,我在百思买文件中的每一行都有一个标题。 not() 函数在哪里定义?或者你只是想要if (!($2 in mem))
    • mem[ $2 ] = 1 不是必需的,mem[$2] 没有分配就足够了,因为您正在检查数组中的键,而不是数组值。
    • 谢谢,这也有效,解释很有帮助。
    【解决方案2】:

    我会这样写:

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

    【讨论】:

      【解决方案3】:

      另一个类似的awk

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

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

      【讨论】:

      • 感谢您的解决方案,这也很有效!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      相关资源
      最近更新 更多