我有一个以下格式的CSV文件:
1,frog
2,truck
3,truck
4,deer
5,automobile
等等,约有5万个条目。我想创建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
答案 0 :(得分: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)
语句设置的名称。
答案 1 :(得分:1)
awk替代方案:
awk -F, '{print $2 > $1 ".txt"}' file.csv
答案 2 :(得分: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