2013-07-25 28 views
1

有不同字符串重複的值,希望它們在每個第二列之後位於新行。將重複值重新排序到新行

數據:

10.1.1.192 wef.xml 10.1.1.156 fwe.xml 10.1.1.159 few.xml 10.1.1.159 vz.xml 10.1.1.159 vsd.xml 10.1.1.209 vsd.xml 10.1.1.216 vsd.xml 10.1.1.195 vsd.xml 10.1.1.195 vsd.xml 10.1.1.194 vsvds.xml 10.1.1.192 vsdh.xml 10.1.1.198 here.xml 10.1.1.200 herrrr.xml 

輸出來完成,其中一個:

10.1.1.192 wef.xml 
10.1.1.156 fwe.xml 
10.1.1.159 few.xml 
10.1.1.159 vz.xml 
10.1.1.209 vsd.xml 
and etc... 
+0

這是好事,看到很多挑戰最近你的問題。我還看到,在發佈新問題之前,迄今爲止提供的解決方案必須是一個好的開始。那麼,你有什麼嘗試? – fedorqui

+0

好吧我嘗試一些事情與sed趕上最後一列有* .xml但有些事情出錯,什麼也沒有發生 –

回答

7
xargs -n2 

測試:

kent$ xargs -n2 <<< "10.1.1.192 wef.xml 10.1.1.156 fwe.xml 10.1.1.159 few.xml 10.1.1.159 vz.xml 10.1.1.159 vsd.xml 10.1.1.209 vsd.xml 10.1.1.216 vsd.xml 10.1.1.195 vsd.xml 10.1.1.195 vsd.xml 10.1.1.194 vsvds.xml 10.1.1.192 vsdh.xml 10.1.1.198 here.xml 10.1.1.200 herrrr.xml"  
10.1.1.192 wef.xml 
10.1.1.156 fwe.xml 
10.1.1.159 few.xml 
10.1.1.159 vz.xml 
10.1.1.159 vsd.xml 
10.1.1.209 vsd.xml 
10.1.1.216 vsd.xml 
10.1.1.195 vsd.xml 
10.1.1.195 vsd.xml 
10.1.1.194 vsvds.xml 
10.1.1.192 vsdh.xml 
10.1.1.198 here.xml 
10.1.1.200 herrrr.xml 
+0

這對我來說是新的和有用的感謝。 –

2

擊溶液:

read -a ar < input 
for ((i=0 ; i<${#ar[@]} ; i+=2)) ; do 
    echo ${ar[i]} ${ar[i+1]} 
done 

它只是讀取整個行到一個數組,然後打印對在一個循環中。

桑達解決方案:

sed -e 's/\([^ ]\+ [^ ]\+\) /\1\n/g' < input 

它通過一個換行符replaves一個空間,如果還有一個之前它的空間。

Perl的一個班輪:

perl -ne 'print $_, ($ff = ! $ff) ? " " : "\n" for split' < input 

它使用$ FF作爲觸發器。

+0

perl謝謝你的好例子。 –

1
while read line; do 
    printf "%s %s\n" $line # the variable is specifically unquoted here 
done <<END 
10.1.1.192 wef.xml 10.1.1.156 fwe.xml 10.1.1.159 few.xml 10.1.1.159 vz.xml 10.1.1.159 vsd.xml 10.1.1.209 vsd.xml 10.1.1.216 vsd.xml 10.1.1.195 vsd.xml 10.1.1.195 vsd.xml 10.1.1.194 vsvds.xml 10.1.1.192 vsdh.xml 10.1.1.198 here.xml 10.1.1.200 herrrr.xml 
END 
10.1.1.192 wef.xml 
10.1.1.156 fwe.xml 
10.1.1.159 few.xml 
... 

另一種方法是變換空間,以換行,然後相應行粘貼在一起:

tr " " "\n" <<< "$line" | paste - -