2016-07-30 122 views
2

我有一行csv包含很多元素。現在我想在bash/shell腳本中的每個第n個元素之後插入一個換行符。Shell命令插入一個換行符的每一個大數行中的第n個元素分隔字符串

獎勵:我想在描述符的前面添加一行,並使用描述符的計數作爲'n'。

例子:

"4908041eee3d4bf98e606140b21ebc89.16","7.38974601030349731","45.31298584267982221","94ff11ce7eb54642b0768dde313e8b25.16","7.38845318555831909","45.31425320325949713", (...) 

"id","lon","lat" 
"4908041eee3d4bf98e606140b21ebc89.16","7.38974601030349731","45.31298584267982221" 
"94ff11ce7eb54642b0768dde313e8b25.16","7.38845318555831909","45.31425320325949713" 
(...) 

編輯:我做了第一次嘗試,但逗號分隔符丟失,則:

(...) | xargs --delimiter=',' -n3 

"4908041eee3d4bf98e606140b21ebc89.16" "7.38974601030349731" "45.31298584267982221" 
"94ff11ce7eb54642b0768dde313e8b25.16" "7.38845318555831909" "45.31425320325949713" 

試圖取代 「」 with「,」

(...) | xargs --delimiter=',' -n3 -i echo ${{}//" "/","} 
-bash: ${{}//\": bad substitution 
+1

向我們展示你嘗試的東西。 – Fazlin

+0

| xargs --delimiter =','-n3但刪除逗號 – mstra001

+0

編輯您的文章並添加您獲得的命令和輸出,以便您可以獲得幫助調試/修復 – Fazlin

回答

3

注意:該解決方案的區別在於,它根據標題行中的列數導出輸出列的數量。

假設在你的CSV輸入的字段沒有嵌入式,情況下(在這種情況下,你需要一個適當的CSV分析器),嘗試awk

awk -v RS=, -v header='"id","lon","lat"' ' 
    BEGIN { 
    print header 
    colCount = 1 + gsub(",", ",", header) 
    } 
    { 
    ORS = NR % colCount == 0 ? "\n" : "," 
    print 
    } 
' file.csv 

注意,如果輸入的文件以換行符結束(就像典型的那樣),你會得到一個額外的換行符輸出。

隨着GNU awk中或Mawk(但 BSD/OSX awk中,只支持文字,單字符RS值),則可以解決這個問題,如下所示:

awk -v RS='[,\n]' -v header='"id","lon","lat"' ' 
    BEGIN { 
    print header 
    colCount = 1 + gsub(",", ",", header) 
    } 
    { 
    ORS = NR % colCount == 0 ? "\n" : "," 
    print 
    } 
' file.csv 

BSD/OSX Awk解決方法:堅持使用-v RS=,並將file.csv替換爲<(tr -d '\n' < file.csv)以便首先從輸入中刪除所有換行符。

4

我會用Perl去!

假設這個輸出是這樣你的文件:

printf "1,2,3,4,5,6,7,8,9,10" 

1,2,3,4,5,6,7,8,9,10 

那麼你可以使用這個,如果你想每4個逗號改爲:

printf "1,2,3,4,5,6,7,8,9,10" | perl -pe 's{,}{++$n % 4 ? $& : "\n"}ge' 
1,2,3,4 
5,6,7,8 
9,10 
+0

同樣在這裏:),我會用perl去:) –

3
cat data.txt | xargs -n 3 -d, | sed 's/ /,/g' 

隨着N = 3這裏輸入文件名稱爲data.txt

+0

++爲解決OP的解決方案的實用解決方案;一般的警告:只有當輸入字段沒有嵌入的空白時(對於OP的數據顯然是真的)纔有效。 – mklement0

2

假設你的輸入文件被命名爲input

echo id,lon,lat; awk '{ORS=NR%3?",":"\n"}1' RS=, input 
相關問題