動的に変更される列位置の処理とファイルの分割

動的に変更される列位置の処理とファイルの分割

私には独特の問題がある。次の列を含むファイルがあります。

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

おすすめ記事