【问题标题】:Splitting CSVs into files named for one of the columns将 CSV 拆分为以某一列命名的文件
【发布时间】:2012-02-04 19:00:19
【问题描述】:

我有这样的 CSV:

apple,file1.txt
banana,file1.txt
carrot,file2.txt

我怎样才能将左列中的所有项目放入以右列中的项目命名的文件中?例如。 file.txt 将包含此列表:

apple
banana

到目前为止,我有这个:

while read line 
do
    firstcolumn=$(echo $line | awk -F ",*" '{print $1}')
    secondcolumn=$(echo $line | awk -F ",*" '{print $2}')

done < Text/selection.csv

【问题讨论】:

  • 你的意思是file1.txt 会包含applebanana 对吧?

标签: bash csv awk


【解决方案1】:

一种使用awk的方式:

awk 'BEGIN { FS = "," } { print $1 >> $2 }' infile

【讨论】:

  • 您可以使用&gt; 代替&gt;&gt;。使用&gt;,输出文件在第一个输出写入之前被擦除。对同一输出文件的后续写入不会擦除输出文件,而是附加到它。 (这与您在 shell 脚本中使用重定向的方式不同。)如果输出文件不存在,则会创建它。来源:gnu awk manual
  • @JaypalSingh:谢谢。现在我意识到你有这个解决方案作为答案。
【解决方案2】:

sed 喜欢这个东西...

sed "s%\(.*\),\(.*\)%echo \1 &gt;&gt; \2 %" inputfile.txt | sh

【讨论】:

    【解决方案3】:

    纯 Bash 并假设所有目标文件为空或不存在:

    while IFS=',' read   item file ; do
      echo "$item" >> "$file"
    done < "$infile"
    

    【讨论】:

      【解决方案4】:

      这应该可行 -

      awk -F, '{a[$1]=$2} END{for (i in a) print i > a[i]}' file
      

      测试:

      [jaypal:~/Temp] cat file
      apple,file1.txt
      banana,file1.txt
      carrot,file2.txt
      
      [jaypal:~/Temp] awk -F, '{a[$1]=$2} END{for (i in a) print i > a[i]}' file
      
      [jaypal:~/Temp] ls file*
      file      file1.txt file2.txt
      
      [jaypal:~/Temp] cat file1.txt 
      apple
      banana
      
      [jaypal:~/Temp] cat file2.txt 
      carrot
      

      更新:

      你也可以这样做——

      awk -F, '{print $1 > $2}' INPUT_FILE
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        相关资源
        最近更新 更多