shell/perl以两行为一个单位查询与这两行第一列相同的

数据格式如下(原数据无前面的行号):
1 E00548:177:HKH53CCXY:4:2124:24393:26413 99 chr21 164
2 E00548:177:HKH53CCXY:4:2218:4564:50252 163 chr21 164
3 E00548:177:HKH53CCXY:4:2124:24393:26413 147 chr21 -164
4 E00548:177:HKH53CCXY:4:2218:4564:50252 83 chr21 -164
5 E00548:177:HKH53CCXY:4:1222:14357:46261 99 chr21 166
6 E00548:177:HKH53CCXY:4:2101:16478:69730 163 chr21 166
7 E00548:177:HKH53CCXY:4:1109:2564:6144 163 chr21 168
8 E00548:177:HKH53CCXY:4:1119:13971:53293 99 chr21 168
9 E00548:177:HKH53CCXY:4:1222:14357:46261 147 chr21 -166
10 E00548:177:HKH53CCXY:4:2101:16478:69730 83 chr21 -166
11 E00548:177:HKH53CCXY:4:1109:2564:6144 83 chr21 -168
12 E00548:177:HKH53CCXY:4:1119:13971:53293 147 chr21 -168
13 E00548:177:HKH53CCXY:4:1114:31842:4720 163 chr21 110
14 E00548:177:HKH53CCXY:4:2118:31558:20014 99 chr21 110
15 E00548:177:HKH53CCXY:4:1114:31842:4720 83 chr21 -110
16 E00548:177:HKH53CCXY:4:2118:31558:20014 147 chr21 -110

一共4列,想以两行为一个单位,分别找到与这两行第一列相同的另外两行,然后将这四行放在一起输出,例如上述结果应该是:
1 E00548:177:HKH53CCXY:4:2124:24393:26413 99 chr21 164
2 E00548:177:HKH53CCXY:4:2218:4564:50252 163 chr21 164
3 E00548:177:HKH53CCXY:4:2124:24393:26413 147 chr21 -164
4 E00548:177:HKH53CCXY:4:2218:4564:50252 83 chr21 -164
5 E00548:177:HKH53CCXY:4:1222:14357:46261 99 chr21 166
6 E00548:177:HKH53CCXY:4:2101:16478:69730 163 chr21 166
9 E00548:177:HKH53CCXY:4:1222:14357:46261 147 chr21 -166
10 E00548:177:HKH53CCXY:4:2101:16478:69730 83 chr21 -166
7 E00548:177:HKH53CCXY:4:1109:2564:6144 163 chr21 168
8 E00548:177:HKH53CCXY:4:1119:13971:53293 99 chr21 168
11 E00548:177:HKH53CCXY:4:1109:2564:6144 83 chr21 -168
12 E00548:177:HKH53CCXY:4:1119:13971:53293 147 chr21 -168
13 E00548:177:HKH53CCXY:4:1114:31842:4720 163 chr21 110
14 E00548:177:HKH53CCXY:4:2118:31558:20014 99 chr21 110
15 E00548:177:HKH53CCXY:4:1114:31842:4720 83 chr21 -110
16 E00548:177:HKH53CCXY:4:2118:31558:20014 147 chr21 -110

实际就是调整了一下数据的顺序,像这里就是换了一下7、8与9、10行的位置

#!/bin/bash
####/autorun/aa/xx.log是原始数据的路径,自己替换
count=`cat /autorun/aa/xx.log|wc -l`
cat /autorun/aa/xx.log|sed -e 's/ /@/g' > /autorun/aa/xx2.log
let i=0
arr=()
while read line
do
arr[$i]=$line
let i=i+1
done < /autorun/aa/xx2.log
for((i=0;i<$count;i=i+2))
do
let j=i+1
let k=i+2
let l=i+3
a=`echo ${arr[$i]}|sed -e 's/@/ /g'|awk '{print $1}'`
b=`echo ${arr[$j]}|sed -e 's/@/ /g'|awk '{print $1}'`
for((m=$k;$m<count;m=`expr $m + 2`))
do
let n=m+1
c=`echo ${arr[$m]}|sed -e 's/@/ /g'|awk '{print $1}'`
d=`echo ${arr[$n]}|sed -e 's/@/ /g'|awk '{print $1}'`
if [ "$a" = "$c" ] && [ "$b" = "$d" ];then
e=${arr[$k]}
f=${arr[$l]}
arr[$k]=${arr[$m]}
arr[$l]=${arr[$n]}
arr[$m]=$e
arr[$n]=$f
fi
done
done
for value in ${arr[*]}
do
echo $value|sed -e 's/@/ /g'
done
有问题的话私信解释
温馨提示:答案为网友推荐,仅供参考
相似回答