根据字段拆分csv并创建子目录然后保存:

时间:2014-05-15 08:27:22

标签: unix awk

想根据第二个“字段”拆分csv文件。例如,csv文件包含:

Input.csv :: / c / Test /

aaa,K1,ppp
ddd,M3,ppp
bbb,K1,ppp
ccc,L2,ppp

根据第二个字段,此文件将被拆分为三个单独的文件。

第一个文件:/c/Test/K1/K1.csv

aaa,K1,ppp
bbb,K1,ppp

第二个文件:/c/Test/M3/M3.csv

ddd,M3,ppp

第三档:/c/Test/L2/L2.csv

ccc,L2,ppp

尝试使用以下命令根据第二列拆分文件并正常工作,但是同一目录中的拆分文件 喜欢:/c/Test/K1.csv和/c/Test/M3.csv等..

awk -F, '{ print > $2".csv"}' Input.csv

尝试过以下命令无法创建子目录并且不完整,请帮忙..

awk -F, 'BEGIN { system("mkdir -p $2") } { print > $10".csv"}' Input.csv

awk -F, '{ print >/system("mkdir -p $2")/ $2".txt"}' Input.csv

2 个答案:

答案 0 :(得分:3)

awk -F, '{ system("mkdir -p "$2); print > $2"/"$2".csv"}' Input.csv

假设您的Input.csv包含:

aaa,K1,ppp
ddd,M3,ppp
bbb,K1,ppp
ccc,L2,ppp

此文件位于/c/Test/,您希望在/c/Test/中创建目录。

与您的尝试的主要区别在于system("mkdir -p "$2),即将$2置于引号之外。这将连接"mkdir -p "$2的值。当您将其放在引号内时,它将变为文字$2,并且该值不可用于mkdir命令。

创建目录后,它会将输出打印到所需的文件,该文件的路径为$2"/"$2".csv"

答案 1 :(得分:0)

您可以使用read

在bash中执行此操作
#!/bin/bash

while IFS="," read a b c; do
    mkdir -p "$b" && echo "$a,$b,$c" >> "$b/$b.csv"
done < Input.csv

read拆分输入字段分隔符(IFS)上的输入行。它使目录基于第二列的名称,echo成为相关文件的行。

或者如果你可以使用bash数组:

#!/bin/bash

(
    IFS=","
    while read -a l
    do 
        mkdir -p "${l[1]}" && echo "${l[*]}" >> "${l[1]}/${l[1]}.csv"
    done < Input.csv
)

使用( )表示脚本运行后会保留$IFS的原始值。