我有一个包含多个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
答案 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)
我看到sed
,awk
和python
,所以这里是普通的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