2012-02-15 61 views
2

我有一組密鑰值對在由分隔每一行文件「:」awk中字段分隔

我獲取使用AWK的關鍵值對作爲讀出每一行後提到下面

key=$(echo $LINE | awk -F " *: *" '{print $1}') 
value=$(echo $LINE | awk -F " *: *" '{print $2}') 

問題在於,如果值本身包含「:」,則會進一步拆分,最終只會讀取「:」之前的值。

我如何讀取整個價值

+0

考慮增加樣本輸入和期望輸出到你的帖子。這將有助於大大減少猜測工作。祝你好運。 – shellter 2012-02-15 16:49:03

回答

3

如果你只是想拆就第一:,它會更容易使用bash字符串操作:

key=${LINE%%:*} 
value=${LINE#*:} 

%% LOPS關閉其正則表達式(:*)從的背面相匹配的最長的字符串字符串,並且#刪除在字符串前面匹配的最短字符串。 例如

$ LINE="a:b:c" 
$ key=${LINE%%:*} 
$ value=${LINE#*:} 
$ echo $key 
a 
$ echo $value 
b:c 

OK,既然你的shell沒有這個,你可以使用sed

key=$(echo "$LINE" | sed 's/:.*$//') 
value=$(echo "$LINE" | sed 's/[^:]*://') 

第一查找並刪除一個冒號和行結束之間的所有內容,並因爲(大多數,包括sed的)正則表達式默認情況下是貪婪的,這將是第一個冒號上的所有內容。第二個刪除所有內容,包括第一個冒號。

+0

這不支持我的shell – Poorna 2012-02-29 09:34:58

+1

@siri ok,在'sed'中添加了一種方法。 – Kevin 2012-02-29 16:25:49

0

如果你的文件包含被解釋爲分隔符號字符,則需要用別的東西來代替這些字符或選擇不同的分隔符。

1

你是總是如果一個字段包含您的分隔符,將會遇到問題。如果你知道某個特定領域總是包含一個分隔符,你可以想出一個解決辦法,你用替換髮生sed第一:

echo $LINE | sed 's/:/|/3' | awk ... 

在上面的例子,如果你知道第三次出現:在一條線上是總是那裏和一個字段內,那麼你可以用|或類似的東西替代它。但這只是一個解決方案的黑客;真正的答案是改變你的分隔符,如果可能的話,或者編寫代碼來解析它,這可以考慮類似escapes的東西(例如\:)。

+1

或者你可以把它全部保存在awk中,使有問題的字段成爲臨時變量,並且split(tmpVar,tmpArr,「:」); =設爲myVal tmpArr [1]; myVal2 = tmpArr [2]; ...'。祝你們好運。 – shellter 2012-02-15 16:46:47

1

回答一個老問題,但使用切割將使這很簡單:

key=$(echo $LINE | cut -d: -f1) 
value=$(echo $LINE | cut -d: -f2-) 

-f2-意味着2場,直到最後