我有一組密鑰值對在由分隔每一行文件「:」awk中字段分隔
我獲取使用AWK的關鍵值對作爲讀出每一行後提到下面
key=$(echo $LINE | awk -F " *: *" '{print $1}')
value=$(echo $LINE | awk -F " *: *" '{print $2}')
問題在於,如果值本身包含「:」,則會進一步拆分,最終只會讀取「:」之前的值。
我如何讀取整個價值
我有一組密鑰值對在由分隔每一行文件「:」awk中字段分隔
我獲取使用AWK的關鍵值對作爲讀出每一行後提到下面
key=$(echo $LINE | awk -F " *: *" '{print $1}')
value=$(echo $LINE | awk -F " *: *" '{print $2}')
問題在於,如果值本身包含「:」,則會進一步拆分,最終只會讀取「:」之前的值。
我如何讀取整個價值
如果你只是想拆就第一:
,它會更容易使用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
的)正則表達式默認情況下是貪婪的,這將是第一個冒號上的所有內容。第二個刪除所有內容,包括第一個冒號。
如果你的文件包含被解釋爲分隔符號字符,則需要用別的東西來代替這些字符或選擇不同的分隔符。
你是總是如果一個字段包含您的分隔符,將會遇到問題。如果你知道某個特定領域總是包含一個分隔符,你可以想出一個解決辦法,你用替換髮生sed
第一:
echo $LINE | sed 's/:/|/3' | awk ...
在上面的例子,如果你知道第三次出現:
在一條線上是總是那裏和一個字段內,那麼你可以用|
或類似的東西替代它。但這只是一個解決方案的黑客;真正的答案是改變你的分隔符,如果可能的話,或者編寫代碼來解析它,這可以考慮類似escapes的東西(例如\:
)。
或者你可以把它全部保存在awk中,使有問題的字段成爲臨時變量,並且split(tmpVar,tmpArr,「:」); =設爲myVal tmpArr [1]; myVal2 = tmpArr [2]; ...'。祝你們好運。 – shellter 2012-02-15 16:46:47
回答一個老問題,但使用切割將使這很簡單:
key=$(echo $LINE | cut -d: -f1)
value=$(echo $LINE | cut -d: -f2-)
-f2-意味着2場,直到最後
考慮增加樣本輸入和期望輸出到你的帖子。這將有助於大大減少猜測工作。祝你好運。 – shellter 2012-02-15 16:49:03