【问题标题】:Building a csv file from multiple files从多个文件构建 csv 文件
【发布时间】:2023-03-27 21:09:01
【问题描述】:

我在一个文件夹中有多个包含一行或多行的 txt 文件。每个文件名都是一个电子邮件地址,其中包含不同的电子邮件地址。

例如,我的文件夹中有 3 个文件:

  • distribution-list1@example.com.txt
  • distribution-list2@example.com.txt
  • distribution-list3@example.com.txt

每个文件的内容:

cat distribution-list1@example.com.txt
john@example.com
aurel@example.com

cat distribution-list2@example.com.txt
doe@example.com

cat distribution-list3@example.com.txt
jack@example.com
gilbert@example.com
jane@example.com

我只想构建一个包含这些数据的文件:

distribution-list1@example.com;john@example.com
distribution-list1@example.com;aurel@example.com
distribution-list2@example.com;doe@example.com
distribution-list3@example.com;jack@example.com
distribution-list3@example.com;gilbert@example.com
distribution-list3@example.com;jane@example.com

【问题讨论】:

标签: bash csv


【解决方案1】:

lists_merge.sh

#!/usr/bin/env bash

shopt -s nullglob;
for fname in *.txt;
do
  while read line; 
  do
    printf "%s;%s\n" "$fname" "$line";
  done <"$fname";
done;

输出

$ ./lists_merge.sh 
distribution-list1@example.com.txt;john@example.com
distribution-list1@example.com.txt;aurel@example.com
distribution-list2@example.com.txt;doe@example.com
distribution-list3@example.com.txt;jack@example.com
distribution-list3@example.com.txt;gilbert@example.com
distribution-list3@example.com.txt;jane@example.com

注意:假定脚本与分发列表文本位于同一目录中 文件。假设此目录中没有其他文本文件


参考

nullglob info

【讨论】:

  • 你为什么使用shopt -s nullglob;这一行?
  • 这是为了处理 glob 没有 *.txt 匹配的情况。在这种情况下,如果没有 nullglob 选项,bash 会抛出错误。另见this question
  • 您可以安全地从脚本中删除所有分号 - 仅当您将两个单独的语句放在一行时才需要它们。
  • 是的,它们是可选的。我的风格偏好是包含它们(感觉更接近我使用的其他语言)。从错误率的角度来看,尽管在 while 循环语句之后总是有分号会有所帮助,即使我在 do 语句之前没有换行符
【解决方案2】:

你可以使用sed:

for emailfile in *.txt; do
    email=${emailfile%.txt}
    sed "s:^:$email;:" "$emailfile"
done

如果电子邮件 ID 有冒号 (:),这将失败,但我怀疑你会有这样的例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 2011-02-06
    • 2016-01-08
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多