2017-02-20 131 views
2

我有以下形式的CSV文件:拆分CSV文件为文本文件

1,frog 
2,truck 
3,truck 
4,deer 
5,automobile 

等,约50 000项。我想创建一个逗号之前的编号命名,并在逗号后面包含单词50个000单独的.txt文件,就像这样:

1.txt contains: frog 
2.txt contains: truck 
3.txt contains: truck 
4.txt contains: deer 
5.txt contains: automobile 

等。

这是我到目前为止已经写的剧本,但它不能正常工作:

#!/bin/bash 

folder=/home/data/cifar10 

for file in $(find "$folder" -type f -iname "*.csv") 
do 
    name=$(basename "$file" .txt) 

while read -r tag line; do 
    printf '%s\n' "$line" >"$tag".txt 
done <"$file" 
rm "$file" 

done 

回答

3

的问题是在你的内循环:

while read -r tag line; do 
    printf '%s\n' "$line" > "$tag".txt 
done < "$file" 

您需要设置IFS,,使标签和线正确解析:

while IFS=, read -r tag line; do 
    printf '%s\n' "$line" > "$tag".txt 
done < "$file" 

您可以使用shopt -s globstar而不是find,Bash 4.0+。这将是免疫分词和通配,不像普通find

shopt -s globstar nullglob 
for file in /home/data/cifar10/**/*.csv; do 
    while IFS=, read -r tag line; do 
    printf '%s\n' "$line" > "$tag".txt 
    done < "$file" 
done 

注意名称通过name=$(basename "$file" .txt)语句设置在你的代码不被使用。

+0

谢谢,不知道我怎么没看到。 – Qubix

1

一个AWK替代:

awk -F, '{print $2 > $1 ".txt"}' file.csv 
0
awk 'BEGIN{FS=","} {print $1".txt contains: "$2}' file 

1.txt contains: frog 
2.txt contains: truck 
3.txt contains: truck 
4.txt contains: deer 
5.txt contains: automobile