2017-08-02 58 views
1

我遇到了我在bash中編寫的腳本的問題。我在while循環中逐行讀取.txt文件。該行的格式爲x:y:z:a:b:c。每個元素('x','a'等)對應於諸如年齡,身高,姓名等等。我已經成功設法打印出所需的字段,但是當我嘗試打印整個「x:y:z:a:b:c」時,「x:y:z」將打印到一個單元格中的.csv,和「a:b:c」將進入下一個單元格,原因是名稱和名字中有一個逗號。我知道這聽起來有點混亂,所以我可以在必要時進一步明確,但這裏是什麼樣子:當數據包含逗號時,在bash中生成一個CSV文件

Cell 1       Cell 2 
age:height:number:last name  first name:language 

我想在一個單元中的所有信息。我認爲這個問題是由於最後名字和名字之間有一個逗號。請讓我知道,如果你有任何提示或指針。

編輯:下面是代碼的樣子:

while read INPUT do 
    str=$INPUT 
    IFS=: read -r -a ARR <<< "$str" 
    NAME=${ARR[0]} 
    AGE=${ARR[3]} 
    echo $AGE, $NAME >>Filedirectory.filename.csv 
done<filedirectory.filename.txt 

...其中filedirectory.filename.txt包含以下內容:

INPUT=Smith, John:126 lbs:67in:26:College University 

考慮的str = "Smith, John:126 lbs:67in:26:College University" 所以,`NAME =史密斯的樣本輸入,約翰,年齡= 26。理想情況下,輸出應該是彼此相鄰的2個單元,其填充爲:

26 - Smith, John 

而是在Excel中輸出,當我打開CSV文件最終被:

12 - Smith - John 

這裏,每個「 - 」象徵着一列(12是在一個小區,在接下來的姓氏等)什麼我想要的是姓氏和名字是在一個單元格中,但顯然這不會發生,因爲名稱被格式化爲「Smith,John」並且逗號使事情變得複雜起來

+1

更改分隔符,並設置爲字符分隔符打開電子表格? –

+2

發佈您的代碼? – Riaz

+0

我不能發佈我的代碼不幸 –

回答

1

一個簡單的實現可能看起來像:

while IFS=: read -r name _ age _; do 
    printf '"%s","%s"\n' "${name//\"/\"\"}" "${age//\"/\"\"}" 
done <in.txt >out.csv 

Less correctly(見描述警告鏈接規範的實際應用信息和理由部分),你可以用echo做到這一點:

while IFS=: read -r name _ age _; do 
    echo '"'"${name//\"/\"\"}"'","'"${age//\"/\"\"}"'"' 
done <in.txt >out.csv 

在這兩種情況下,我們與周圍的引號單元格內容,並使用parameter expansion來將在字符串內部找到的任何引號加起來,這使得這些引號在CSV語法中變成文字。

0

您可以使用Excel功能:
當第一行是SEP=:時,csv文件將作爲SEP讀取。
現在很容易:

sed -r ' s/([^:]*):([^:]*):([^:]*):([^:]*):.*/\4:\1/; 
     1s/.*/SEP=:\n&/' <filedirectory.filename.txt> outputfile; 
相關問題