2013-04-20 55 views
1

我有一個數據集,我從Google Spreadsheet中剪切粘貼到我的文本編輯器(Sublime Text 2)中,數據集不符合我的處理需求。用0填充文本文件中的空列

它以電子表格的形式出現,數據從一行字符串開始,每列一列,然後是一些數據行;在數據行中,每列都有值爲1或爲空。我不知道數據是否是從電子表格中分離出來的,但是在粘貼到文本文件後它不是。如果最後一列中的最後一個1不在最後一列,則填充空格直到,但不包括最後一列的

我試着用awk做一些事情,但我無法弄清楚如何解決空間既是分隔符又是列值的問題。接下來,我嘗試了一些命令與sed,包括零和管道到另一個sed1 0取代10取代連續的空格,但後來我有時有多餘的零插入,我不知道在發生的各行。

這是一些示例數據(實際文件中有13列)。我添加了$作爲最後一個字符後面的字符,因此您可以看到線條填充的距離。

"1" "2" "3" "4"       "1" "2" "3" "4" 
    1 1 $         0 1 1 0 
1  1 $         1 0 0 1 
    1 $         0 1 0 0 
1 1 1 $         1 1 0 1 

我想的東西,如正確的(然後我不在乎行的結束位置),這樣我就可以awk處理它結束了。

順便說一句,我看到this question,這並沒有解決我的問題,因爲該解決方案有基於這樣的事實,該文件是製表符分隔,沒有任何價值可言的「空」細胞。重申一下,我的文件是空格分隔的,在空單元格中有空格。

回答

0

試圖解釋爲什麼一個問題是很難有利於你的機會來解決它。只是因爲我想到的解釋在這裏,我也想出了一個解決方案=)

解決方案的工作與sed,基本上分三個步驟:

  1. 0全部替換爲空第一列:

    cat datafile.txt | sed 's/^ /0 /g' 
    
  2. 0全部替換爲空最後列:

    cat datafile.txt | sed 's/^ /0 /g' | sed 's/ $/ 0/g' 
    

    在這裏,我不得不嘗試一點與在正則表達式空格數,調整所有新的零權。

  3. 0全部替換爲空列:

    cat datafile.txt | sed 's/^ /0 /g' | sed 's/ $/ 0/g' | sed 's//0/g' 
    

    在這裏,我也嘗試將0第一個或最後在更換正則表達式來得到它的權利。

,當然還有,這樣做後,我通過在月底> datafile-clean.txt標記輸出重定向到文件中。

有可能是一個更優雅的方式來做到這一點,所以如果你有一個,即使我個人不需要解決方案,請儘快發佈。

更新:如評論中所示,此解決方案可以提高很多。我會把原來的解決方案放在這裏,因爲我認爲它更清楚它做了什麼,以什麼順序,但應該用它來代替。

首先,我們不需要這麼多的管道;相反,我們使用-e國旗sed

sed -e 's/^ /0 /' -e 's/ $/ 0/' -e 's//0/g' datafile.txt 

這個作品一樣,是的,因爲第一行與列標題沒有任何雙空格。如果確實如此,則可以使用tail -n +2 datafile來讀取該文件,並通過管道連接到上述sed命令。

+0

拜託,拜託,不要使用'貓文件| sed的...'!你只是浪費一點資源而已。請改用sed ... TrueY 2013-04-20 20:04:13

+0

像'/^.../'和'/...$/'這樣的pattenrs真的需要'g'嗎?它們只能匹配一次。 – TrueY 2013-04-20 20:08:07

+0

不幸的是,沒有匹配'/ $ /'模式的情況。最後一個字符總是一個空格。 – TrueY 2013-04-21 22:11:39

0

我的第一次嘗試並不好。所以我第二第三第四嘗試根據修改的輸入與自動確定列數:

awk 'NR==1{for(;N<NF;++N)sp=" 0"sp}NR>1{$0=" "$0;sub(" +$","");gsub(" "," 0");$0=substr($0sp,2,2*N-1)}1'<<EOT 
"1" "2" "3" "4" 
    1 1 
1  1 
    1 
1 1 1 
EOT 

第一空間甚至,在那些之間是奇數,所以我在開始時加入的空間讓兩種情況下使用相同的gsub。目前還不清楚有多少尾隨空間出現,所以劇本只是跺腳。它包含0場數的數量。 Substr從2開始剪切添加的引導空間,並且持續到(number of fields)*2-1字符剪切尾部空間。

輸出:

"1" "2" "3" "4" 
0 1 1 0 
1 0 0 1 
0 1 0 0 
1 1 0 1 
+0

這是一個很好的解決方案,但我更喜歡一個獨立於字段數量的解決方案,所以我可以將它重用於其他具有相同問題的數據文件。如果需要,添加一個變量(例如'-v N = 7')是可以的,但是如果腳本本身是「NF不可知的」,它會更好...... – 2013-04-22 19:25:13

+0

@Thomas Lycken:好的,修改代碼。項目的數量可以從第一行確定。 – TrueY 2013-04-22 19:53:04

0
sed 's/ /0/g;s/10/1 /g;s/00/0 /g;s/$/0 /' datafile.txt | cut -c 1-7