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、 、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

ただし、値の順序が変わるため、おそらく希望どおりにはなりません。

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