1

我有一个包含多个 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
4

5 回答 5

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
于 2012-07-18T09:12:19.860 回答
3
awk -v FS=':' -v RS=' ' -v ORS=' ' '{print $2}' foo.txt 

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

于 2012-07-18T09:10:47.903 回答
1

我看到sed,awkpython, 所以这里很简单bash

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

只是为了更好的衡量,这里有一个perl版本:

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

但是,值的顺序会发生变化,因此它可能不是您想要的。

于 2012-07-18T11:49:25.953 回答
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

于 2012-07-18T10:03:23.710 回答
0

使用awk的解决方案:

awk '{split($0,p," "); for(kv in p) {split(p[kv],a,":"); printf "%s ",a[2];} print ""}' foo.txt
于 2012-07-18T09:08:58.817 回答