2016-11-25 107 views
0

如何在bash中为csv导入准备给定的txt文件? 给定的结构是这样的:如何使用bash脚本准备一个txt文件到csv?

Salutation 
Name 
Surname 
Telephone 
E-Mail 
Street 
City 
Gender 
Employment 
Income 
***** 
Salutation 
Name 
Surname 
Telephone 
E-Mail 
Street 
City 
Gender 
Employment 
Income 
***** 
Salutation 
Name 
Surname 
E-Mail 
Street 
City 
Gender 
Employment 
Income 
***** 

正如你所看到的第二个记录不具有E-Mail地址。 未给定值的任何其他变化也是可能的。 这些值是逐行给出的,记录由五颗星分开。

我试图使用awk和grep为了将记录写入csv导入的分离文件中。 如何将一条记录的给定乘数行放在一行中用于csv和 如何保存订单电话号码没有给出?

非常感谢提前。

+0

当一个字段丢失时会发生什么?你想输出一个空的字段或只是完全跳过它?你能告诉我们一个样例输出和你尝试过的awk代码吗? – Aserre

回答

1

通常.csv文件具有固定的记录 - 并且未包含的字段保留为空。所以,你的第一个例子是:

"Mr","John","Smith","555-1212","[email protected]","1 St","New York","M","CSV Wrangler","5" 

和你的第二个可能是:

"Mrs","Mary","Brown",,"[email protected]","5 St","Ottawa","F","CSV Wrangler","5" 

。在你的输入文件来检测缺少这方面没有办法,虽然。这意味着您将无法可靠地创建.csv文件。除非您根据内容推断字段(“这包含@符号,因此必须是电子邮件地址”等),否则您需要知道字段名称和字段值。即使这样做会失败,如果您有如下记录:

**** 
Homer 
Springfield 
**** 

是这个名字和姓氏,或名字和城市?你没有办法告诉。

+0

Thx为您的答案。想象一下,像姓氏这样的标识符:约翰,姓名:史密斯,电话:(没有输入)等等。我如何获得这些乘法线在一行中用“;”分隔对于csv并且在五颗星出现时会有换行符? – bashy

+0

@bashy那么这可以很容易地用awk或sed来完成。您能否提供带有正确字段和虚拟值的示例输入文件? – Aserre

+0

@Aserre Thx 4回答。我尝试过使用sed,就像'code' sed's/^ [^:] *:* \([+ 0-9。] \ + \)。*/\ 1 /'/tmp/INFILE.txt | sed -e:a -e'$!N; S/\ N /,/; TA” >> /tmp/OUTFILE.txt'code' – bashy

0

为了使问题更清楚:
我得到它含有大量的不需要的东西电子邮件请求。
因此,我将* .eml文件导出到/ tmp目录。
我将这样所需的信息收集到一个名为Input.txt的文件中。
我的代码如下所示:

#!/bin/bash 
 
touch /tmp/Input.txt 
 
OUTFILE=/tmp/Input.txt 
 
cat /dev/null > "$OUTFILE" 
 
FILES=/tmp/*.eml 
 
for f in $FILES 
 
do 
 
\t grep 'Salutation   :' "$f" | sed 's/^.*: //' | perl -ne 'print "S1 $_"' >> "$OUTFILE" 
 
    \t grep 'Surname   :' "$f" | sed 's/^.*: //' | perl -ne 'print "S2 $_"' >> "$OUTFILE" 
 
    \t grep 'Name    :' "$f" | sed 's/^.*: //' | perl -ne 'print "S3 $_"' >> "$OUTFILE" 
 
    \t grep 'Telephone   :' "$f" | sed 's/^.*: //' | perl -ne 'print "S4 $_"' >> "$OUTFILE" 
 
    \t grep 'E-Mail    :' "$f" | sed 's/^.*: //' | perl -ne 'print "S5 $_"' >> "$OUTFILE" 
 
    \t grep 'Street    :' "$f" | sed 's/^.*: //' | perl -ne 'print "S6 $_"' >> "$OUTFILE" 
 
    \t grep 'City    :' "$f" | sed 's/^.*: //' | perl -ne 'print "S7 $_"' >> "$OUTFILE" 
 
    \t grep 'Date    :' "$f" | sed 's/^.*: //' | perl -ne 'print "S8 $_"' >> "$OUTFILE" 
 
    \t grep 'Size    :' "$f" | sed 's/^.*: //' | perl -ne 'print "S9 $_"' >> "$OUTFILE" 
 
    \t grep 'Animals   :' "$f" | sed 's/^.*: //' | perl -ne 'print "S10 $_"' >> "$OUTFILE" 
 
    \t grep 'Employment   :' "$f" | sed 's/^.*: //' | perl -ne 'print "S11 $_"' >> "$OUTFILE" 
 
    \t grep 'Income    :' "$f" | sed 's/^.*: //' | perl -ne 'print "S12 $_"' >> "$OUTFILE" 
 
    \t echo "*****" >> "$OUTFILE" 
 
done

最后我得到的OUTFILE INPUT.TXT这样的:

S1先生
S2约翰
S3史密斯
S4 1514009855
S5 [email protected]
S6 11 Elm Street
S7丹佛
S8 2016年5月21日
S9 66
S10猫
S11官
S12 20
*****
S1太太
S2玛丽
S3木材
S4 65223457
S5 [email protected]。com
S6 60 Taft Ave.
S7波士顿
S8 2016年4月26日
S10狗
S11秘书
S12 10
*****
S1夫人
S2洛瑞
S3白
S4 56325478
S6 730 Vista del Playa
S7 Anaheim
S8 01/22/2016
S10鱼
S11教师
S12 80
*****


所以第一个记录是完整的S1至S12。
在第二个记录中有S9缺失,第三个记录中缺少S5和S9。
目标是从Input.txt中读取这些记录并将它们放入csv文件中。
的CSV应该是这样的,考虑到遗失物品:
称呼,姓氏,姓名,电话,电子邮件,街道,城市,日期,大小,动物,就业,收入
先生,约翰,史密斯; 1514009855 ; [email protected]; 11ElmStreet; Denver; 05/21/2016; 66; Cat; Officer; 20
Mrs; Mary; Wood; 65223457; [email protected]; 60TaftAve。; Boston; 04/26/2016 ;; Dog; Secretary; 10
Mrs; Lori; White; 56325478 ;; 730VistadelPlaya; Anaheim; 01/22/2016 ;; Fish; Teacher; 80

相关问题