2016-11-25 106 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

相關問題