簡體   English   中英

如何從鍵值對列表中切出值

[英]How to cut out the Values from a list of Key-Value pairs

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

這樣可以嗎

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
awk -v FS=':' -v RS=' ' -v ORS=' ' '{print $2}' foo.txt 

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

我看到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

但是,值的順序會更改,因此可能不是您想要的。

awk解決方案:

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

嘗試這個

Input.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM