想根据第二个“字段”拆分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
答案 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
#!/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
的原始值。