我需要的文件全行的轉換是這樣的: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
大多數時候,自己寫一個循環在shell中,您正在使用錯誤的工具。當然也有例外,但它們涉及進程或文件操作(創建/銷燬)而非文本操作。 – 2013-05-02 12:24:55