unix - 如何根据多个列值拆分文件

标签 unix awk split multiple-columns aix

我需要获取这个 test_file 并将其拆分为 col5 和 col6 的每个独特组合都有一个单独的文件。 另一个警告是该文件需要在 150,000 条记录后进行拆分。此外,还需要从文件中提取命名约定: "$5"_"$6"_P"sysdate"_IU"$4"60""[文件号]".zip

测试文件.csv

col1, col2, col3, col4, col5, col6 ..... col32
1234, 6789, 1, 01/31/2017 00:00:00, 1000, 1234 ..... col32
1235, 1233, 1, 01/31/2017 00:00:00, 1000, 1234 ..... col32
1236, 4423, 1, 01/31/2017 00:00:00, 1000, 5678 ..... col32
1237, 3323, 1, 01/31/2017 00:00:00, 1000, 1234 ..... col32
1238, 0808, 1, 01/31/2017 00:00:00, 1000, 1234 ..... col32
1239, 2222, 1, 01/31/2017 00:00:00, 2000, 1234 ..... col32
1231, 4535, 1, 01/31/2017 00:00:00, 2000, 1234 ..... col32
1232, 8080, 1, 01/31/2017 00:00:00, 2000, 5678 ..... col32
1233, 7878, 1, 01/31/2017 00:00:00, 2000, 5678 ..... col32

结果应如下所示:

1000_1234_P20170203_IU20170131_60_1.ZIP
col1, col2, col3, col4, col5, col6 ..... col32
1234, 6789, 1, 01/31/2017 00:00:00, 1000, 1234 ..... col32
1235, 1233, 1, 01/31/2017 00:00:00, 1000, 1234 ..... col32
1237, 3323, 1, 01/31/2017 00:00:00, 1000, 1234 ..... col32
1238, 0808, 1, 01/31/2017 00:00:00, 1000, 1234 ..... col32

1000_5678_P20170203_IU20170131_60_1.ZIP
col1, col2, col3, col4, col5, col6 ..... col32
1236, 4423, 1, 01/31/2017 00:00:00, 1000, 5678 ..... col32

2000_1234_P20170203_IU20170131_60_1.ZIP
col1, col2, col3, col4, col5, col6 ..... col32
1239, 2222, 1, 01/31/2017 00:00:00, 2000, 1234 ..... col32
1231, 4535, 1, 01/31/2017 00:00:00, 2000, 1234 ..... col32

2000_5678_P20170203_IU20170131_60_1.ZIP
col1, col2, col3, col4, col5, col6 ..... col32
1232, 8080, 1, 01/31/2017 00:00:00, 2000, 5678 ..... col32
1233, 7878, 1, 01/31/2017 00:00:00, 2000, 5678 ..... col32

最佳答案

从这里开始:

awk -F', *' -v sysdate="$(date +'%Y%m%d')" '
NR==1 { hdr = $0; next }
(cnt[$5,$6]++ % 150000) == 0 { sfx[$5,$6]++ }
{
    split($4,d,/[\/ ]/)
    out = $5 "_" $6 "_P" sysdate "_IU" d[3] d[1] d[2] "_60_" sfx[$5,$6] ".zip"
    if (!seen[out]++) {
        print hdr > out
    }
    print > out
}
' file

并进行适合的按摩。如果您不使用 GNU awk,则可能需要 close() 文件,以避免出现“打开的文件太多”错误。

关于unix - 如何根据多个列值拆分文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42029642/

相关文章:

reactjs - 当组件变大时如何拆分它。 ReactJs 或 React Native

javascript - 简单的 JavaScript 拆分函数

shell - 如何使用awk去除标点符号?

bash - 从一行中提取列的值(变量)

linux - 如何在csv文件中并排添加数据

php - 将字符串拆分为数字和文本,但接受内部包含单个数字的文本

c - 如何 - 使用文件锁求矩阵元素之和 (unix - C/C++)

linux - 如何显示多个文件的第三行

linux - Linux/Unix 中是否有一次注释掉多行的命令?

linux - 使查找命令不区分大小写