如何从键值对列表中删除值

时间:2012-07-18 08:53:20

标签: python bash text awk

我有一个包含多个KV对的文件。

输入:

$ cat input.txt
k1:v1 k2:v2 k3:v3
...

我只对价值感兴趣。键(名称)只是为了记住每个值的含义。基本上我希望cut键出来,以便我可以绘制值列。

输出:

$ ...
v1 v2 v3

他们的单行bash命令可以帮助我实现这个目标吗?

更新


这就是我目前正在做的事情(看起来很难看)

>> cat input.txt | python -c "import sys; \
   lines = sys.stdin.readlines(); \
   values = [[i.split(':')[1] for i in item] for item in \
   [line.split() for line in lines]]; \
   import os; [os.system('echo %s'%v) for v in \
   ['\t'.join(value) for value in values]]" > output.txt

5 个答案:

答案 0 :(得分:4)

这对你好吗?

sed -r 's/\w+://g' yourfile

试验:

kent$  echo "k1:v1 k2:v2 k3:v3"|sed -r 's/\w+://g'                                    
v1 v2 v3

<强>更新 好吧,如果你的密钥包含“ - ”等:见下文

kent$  echo "k1#-$%-^=:v1 k2:v2 k3:v3"|sed -r 's/[^ ]+://g'  
v1 v2 v3

答案 1 :(得分:3)

awk -v FS=':' -v RS=' ' -v ORS=' ' '{print $2}' foo.txt 

http://www.gnu.org/software/gawk/manual/gawk.html#Field-Separators

答案 2 :(得分:1)

我看到sedawkpython,所以这里是普通的bash

while IFS=' ' read -a kv ; do printf '%s ' "${kv[@]#*:}" ; done < input.txt

只是好好衡量,这是一个perl版本:

perl -n -e 'print(join(" ",values%{{@{[split(/[:\s]/,$_)]}}})," ")' < input.txt

但是值的顺序会发生变化,所以它可能不会是你想要的。

答案 3 :(得分:0)

解决方案 awk

awk '{split($0,p," "); for(kv in p) {split(p[kv],a,":"); printf "%s ",a[2];} print ""}' foo.txt

答案 4 :(得分:0)

试试这个

输入.txt

k1:v1 k2:v2 k3:v3

<强>代码

 awk -F " " '{for( i =1 ; i<=NF ;i+=1) print $i}' Input.txt | cut -d ":" -f 2 | tr '\n' ' '

<强>输出

v1 v2 v3