2013-05-01 14 views
0

我需要的文件全行的轉換是這樣的:BASH:空間分隔的文件使用cut:治療兩個空格作爲一個

# 2007 4 29 10 1 17.98 blah other stuff 

成格式化這樣

2007.04.29.10.01.17 

原線行是空格分隔的,當一個人的位數字出現(例如4)時,它被列爲'4'。當我轉換它時,我需要能夠將其更改爲'04'。因此,有空格分隔文件,AND空格是前導零的佔位符。

我需要編寫一個shell腳本來進行轉換。我試過使用cut命令,因爲每個字符都停留在同一個確切位置,所以第7個字符總是一個分隔空間,第8個字符總是十位數字,或者是應該是前導零的空格。然而,我很快就發現,它將兩個空格視爲一個整體拋出計數(因爲有時候我有'4',有時我會有'14')

所以:我需要一種方法來讀取和轉換這個文件,無論是使用剪切,或其他方法(awk?),這將允許我做到這一點。要麼修改我當前的代碼(下面)或另一種方法,將更好的工作方式,將不勝感激

僅供參考,我現在的代碼如下:

while read LINE 
do 
    #IF line starts with '#', then 
    if [[ $LINE == "#"* ]]; then 

     #123456789
     # 2008 12 26 11 26 20.36 
     # 2007 5 10 1 8 10.52 

     #GET 4 digit year 
     LINEyear=$(echo $LINE | cut -c3-6) 

     #GET 2 digit month 
     if [ $(echo $LINE | cut -c8-8) == " " ]; then 
      LINEmonth=0$(echo $LINE | cut -c8-9)     
     else 
      LINEmonth=$(echo $LINE | cut -c8-9) 
     fi 

     #GET 2 digit day 
     if [ $(echo $LINE | cut -c11-11) == " " ]; then 
      LINEday=0$(echo $LINE | cut -c11-12) 
     else 
      LINEday=$(echo $LINE | cut -c11-12) 
     fi 

     #GET hour, min, sec, (Removed to save space) 

     LINEnew=$LINEyear.$LINEmonth.$LINEday.$LINEhour.$LINEmin.$LINEsec 
     echo $LINEnew 

    fi 
done 
+0

大多數時候,自己寫一個循環在shell中,您正在使用錯誤的工具。當然也有例外,但它們涉及進程或文件操作(創建/銷燬)而非文本操作。 – 2013-05-02 12:24:55

回答

2

您可以在只有一行解決這個問題:

% awk '/^#/ {printf "%04d.%02d.%02d.%02d.%02d.%02d\n", $2, $3, $4, $5, $6, $7}' ~/stuff 

收率:

2007.04.29.10.01.17 
+0

好的。那麼現在我得到正確的格式(謝謝),但我不再將字符串存儲爲變量。我需要這樣做,因爲我需要將它與稍後的另一個字符串設置文件進行比較。 我試過LineNew = awk'/ ^#/ {printf ....等,但是沒有工作 – 2013-05-02 01:11:33

+0

我明白了。在你的問題中,你只是回聲匹配的線條,這就是我正在模擬/修復的。 [tag:awk]也可以進行比較,我相信,但這似乎是一個不同的問題,應該這樣問。 – Johnsyweb 2013-05-02 02:43:47

+0

我只是將輸出打印到一個文件中,然後我將製作一個單獨的程序來將它與另一個文件進行比較,但不是很整潔,但它應該可以正常工作。 – 2013-05-02 05:01:44

1
echo "# 2007 4 29 10 1 17.98 blah other stuff" | tr -s " " 

我與cut因爲在空間界定的可變性的結合使用tr,所述tr -s ' '修剪多個空格。

然後,使用cut忽略兩個#(除非你想,作爲一個字段),然後第二次來接,說第四場:你發現

echo "# 2007 4 29 10 1 17.98 blah other stuff" | tr -s " " | cut -d'#' -f2 | cut -d' ' -f4 
相關問題