2011-08-23 98 views
0

我在Excel電子表格中發送了大量URL的列表,每個列表根據字符串中的某個獲取變量進行唯一性設置(值的範圍是5-7個數字長度)。我不得不根據這些數據在我們的數據庫上運行一些查詢,並且不想經過數百個條目逐個除去數字。 BASH命令可用於解析每行中的數字(它是每行中的唯一數字)並將其整合到一行,所有數字以逗號分隔?使用BASH顯示來自CSV的統一數字列表

的CVS電子表格的樣品(縮短)列表包括:

http://www.domain.com/view.php?fDocumentId=123456 
http://www.domain.com/view.php?fDocumentId=223456 
http://www.domain.com/view.php?fDocumentId=323456 
http://www.domain.com/view.php?fDocumentId=423456 
DocumentId=523456 
DocumentId=623456 
DocumentId=723456 
DocumentId=823456 
.... 
... 

格式的改變是故意的,因爲它們決定簡單地減小下來的變量名和值幾行之後。 get變量從fDocumentId更改爲DocumentId也是有意的。理想的輸出將類似於:

123456,23456,323456,423456,523456,623456,723456,823456 

編輯:我的道歉,我沒有注意到,在列表中有一半的方式,他們決定讓小青蛙和改變周圍的事物,有條目,當保存爲CSV,某些行將顯示爲:

"DocumentId=098765 COMMENT, COMMENT" 
DocumentId=898765 COMMENT 
DocumentId=798765- COMMENT 
"DocumentId=698765- COMMENT, COMMENT" 

與其他幾個條目看起來類似於上述任何行。 COMMENT可以與(大寫)字符的單個字符串比每COMMENT

+0

你試圖解析的例子可能會有所幫助。 – womble

+0

向我們展示了一些輸入和一些預期的輸出(合適的編輯)。 – Iain

回答

2

假設變量總是在它自己的,與去年上線,大概只是採取一切是在=權怎麼樣?

sed -r "s/.*=([0-9]+)$/\1/" testdata | paste -sd"," 

編輯:好,用新信息,你必須編輯正則表達式位:

sed -r "s/.*f?DocumentId=([0-9]+).*/\1/" testdata | paste -sd"," 

這裏什麼DocumentId或fDocumentId將被捕獲後。適用於迄今爲止提供的數據,至少。

+0

感謝您的編輯,這是完美的工作,並且是在一個不像Ctrl-C Ctr-V那麼簡單的環境中輸入的最簡單的解決方案。 – Scott

0

如果你沒有完全致力於抨擊長度爲3個字符不再更換,瑞士軍刀將幫助:

perl -ne '{$_=~s/.*=//; $_=~s/ .*//; $_=~s/-//; chomp $_ ; print "$_," }' < YOUR_ORIGINAL_FILE 

將所有內容剪切到(包括)=,然後將所有內容剪切到空格後,然後刪除所有破折號。上述輸入運行,返回

123456,223456,323456,423456,523456,623456,723456,823456,098765,898765,798765,698765, 
+0

通常情況下,這不會是一個問題,但是使用perl v5.8.8,我得到''-bash-3.2 $ G'「''' – Scott

+0

的回報,我正在使用5.12.3,而且沒有任何花哨你可以檢查你的原始文件*真的*看起來像你發佈的文件嗎? – MadHatter

+0

剛剛在5.8.8上試過了,我得到的結果是一樣的,你可能想用複製粘貼文本你張貼上面(不包括「...」的行) – MadHatter

1

比這更簡單:) cat file.csv | cut -d「=」-f 2 | xargs

+0

這不適用於新數據,並且不會使用逗號分隔 – carlpett

+1

至少在我的系統上,用空格而不是逗號分隔數字。自從'cut -d「=」-f 2 MadHatter

+0

呵呵,在發帖之前,我已經問過自己,如果我應該折磨這隻可憐的貓,它會讓我。感謝MadHatter – Razique

相關問題