将重复值排序到新行

时间:2013-07-25 10:05:08

标签: perl sed awk

具有以不同字符串重复的值,希望它们在每第二列之后位于新行上。

数据:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

Bash解决方案:

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

它只是将整行读入数组,然后在循环中打印对。

Sed解决方案:

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

如果前面还有一个空格,它会用换行符替换空格。

Perl one-liner:

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

它使用$ ff作为触发器。

答案 2 :(得分: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 - -