处理动态变化的列位置和分割文件

处理动态变化的列位置和分割文件

我有一个独特的问题。我有一个包含以下列的文件

PersonId, AB1, AB2, AB3, DG1_B1,DG1_B2,DG2
1,0,1,0,3,5,7
2,0,3,1,3,7,4

我想拆分它并根据列前缀创建多个文件。我希望输出如下

  • File_AB1.csv

    PersonId, AB1, AB2, AB3
    1,0,1,0
    2,0,3,1
    
  • File_DG1.csv

    PersonId, DG1_B1,DG1_B2
    1,3,5
    2,3,7
    
  • File_DG2.csv

    PersonId, DG2
    1,7
    2,4
    

该文件还存在另一个问题。下次获取输入文件时,列的顺序可能会发生变化,如下所示(注意列 AB3 移至行尾)。

PersonId, AB1, AB2,DG1_B1,DG1_B2,DG2,AB3
1,0,1,3,5,7,0
2,0,3,3,7,4,1

我怎样才能在 awk 中完成这个任务?

答案1

你可以这样做:

awk -F, '
  NR == 1 {
    for (i = 2; i <= NF; i++)
      if (match($i, /AB|DG./))
        file_list[file[i] = "file_" substr($i, RSTART, RLENGTH) ".csv"]
  }
  {
    for (f in file_list) printf "%s", $1 > f
    for (i = 2; i <= NF; i++) printf ",%s", $i > file[i]
    for (f in file_list) print "" > f
  }'

(它调用文件file_AB.csv(基于前缀),而不是file_AB1.csv

相关内容