将CSV文件拆分为文本文件

时间:2017-02-20 15:18:12

标签: bash shell scripting

我有一个以下格式的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 

3 个答案:

答案 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