UNIX - 3つの固有値が列のすべての行に対応する複数のファイルにファイルを分割するコマンド

UNIX - 3つの固有値が列のすべての行に対応する複数のファイルにファイルを分割するコマンド

次の入力ファイルを検討してください。入力ファイル:

C1|C2|C3|C4|C5|C6
0|1|2|3|0-1-2-3|4
0|2|2|4|0-1-2-3|5
0|1|2|3|1-3-2-4|4
0|1|2|3|1-1-3-4|4
0|1|2|3|1-1-3-4|5
0|1|2|3|4-5-2-6|4
0|1|2|3|4-5-2-6|6
0|4|5|3|7-4-2-4|4
0|1|2|3|7-4-2-5|4
0|1|2|3|7-4-2-5|5
0|1|2|3|7-4-2-5|6
0|1|2|3|7-5-2-6|5

フィールド5(たとえば、最初のレコードの0-1-2-3)に基づいて、出力分割ファイルは次のように分割ファイル1になると予想されます。

C1|C2|C3|C4|C5|C6
0|1|2|3|0-1-2-3|4
0|2|2|4|0-1-2-3|5
0|1|2|3|1-3-2-4|4
0|1|2|3|1-1-3-4|4
0|1|2|3|1-1-3-4|5

分割ファイル2:

C1|C2|C3|C4|C5|C6
0|1|2|3|4-5-2-6|4
0|1|2|3|4-5-2-6|6
0|4|5|3|7-4-2-4|4
0|1|2|3|7-4-2-5|4
0|1|2|3|7-4-2-5|5
0|1|2|3|7-4-2-5|6

分割ファイル3:

C1|C2|C3|C4|C5|C6
0|1|2|3|7-5-2-6|5

列5に基づいて、ファイルはその列の3つの固有値に分割し、列5の値を繰り返すすべての行も含める必要があります。誰かが私を助けることができますか?

ベストアンサー1

動作します。それは次のとおりです。

awk -F'|' -v fileformat="/abc/output/file_%04d.txt" -v max=3 -v field=5 '
  NR == 1 {header = $0; next}
  ! ($field in seen) {
    seen[$field]
    if (++n % max == 1) {
      close(out)
      out = sprintf(fileformat, ++f)
      print header > out
    }
  }
  {print > out}' < /abc/input/a.txt

おすすめ記事