2017-02-20 171 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