Awk字段分隔符

时间:2012-02-15 15:54:55

标签: awk

我在每行由“:”

分隔的文件中有一组键值对

我在阅读每一行后使用awk获取键值对,如下所述

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

问题在于,如果值本身包含“:”,则进一步拆分,我将最终只读取“:”之前的值。

如何阅读整个值

4 个答案:

答案 0 :(得分:3)

如果你只想分开第一个:,那么使用bash字符串操作会更容易:

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

%%从字符串后面删除与其正则表达式(:*)匹配的最长字符串,#删除在字符串前面匹配的最短字符串。 e.g。

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

好的,既然你的shell没有这个,你可以使用sed

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

第一个查找并删除冒号和行尾之间的所有内容,因为(大多数,包括sed的)正则表达式默认是贪婪的,这将是第一个冒号的所有内容。第二个删除所有内容,包括第一个冒号。

答案 1 :(得分:1)

如果某个字段包含您的分隔符,那么总是会遇到问题。如果您知道特定字段始终包含分隔符,则可以首先使用sed替换该事件:

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

在上面的示例中,如果您知道某一行中第三次出现: 总是并且在某个字段内,那么您可以将其替换为|或类似的东西。但这只是一个解决方案的黑客;真正的答案是在可能的情况下更改分隔符,或编写解析它的代码,以考虑类似转义的内容(例如\:)。

答案 2 :(得分:1)

回答一个老问题,但使用cut会使这很简单:

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

-f2-表示字段2直到结束

答案 3 :(得分:0)

如果您的文件包含被解释为分隔符号的字符,那么您将需要用其他字符替换这些字符或选择不同的分隔符。