2015-10-20 114 views
2

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

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

每个文件的内容:

cat [email protected] 
[email protected] 
[email protected] 

cat [email protected] 
[email protected] 

cat [email protected] 
[email protected] 
[email protected] 
[email protected] 

我想建立一个包含这些数据只有一个文件:

[email protected];[email protected] 
[email protected];[email protected] 
[email protected];[email protected] 
[email protected];[email protected] 
[email protected];[email protected] 
[email protected];[email protected] 
+0

[在Bash中通过文件内容循环?](http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash) – grimsock

回答

3

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 
[email protected];[email protected] 
[email protected];[email protected] 
[email protected];[email protected] 
[email protected];[email protected] 
[email protected];[email protected] 
[email protected];[email protected] 

注:脚本假设与分发列表文本位于同一目录中 文件。将不承担任何其他文本文件都在此目录中


参考

nullglob info

+0

你为什么使用''shopt -s nullglob'行'? – gpupo

+0

这是为了处理glob没有* .txt匹配的情况。在这种情况下,bash将抛出一个没有nullglob选项的错误。另请参见[此问题](http://stackoverflow.com/questions/2937407/test-whether-a-glob-has-any-matches-in-bash) – amdixon

+0

您可以安全地从脚本中删除所有分号 - 它们只有当您在一行上放置两个单独的语句时才需要。 –

1

您可以使用sed

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

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