Shell实现将多行整合成一行以及行和列的转化

源内容:

4 00000080AB34
5 00000080AB35
5 00000080AB36
6 00000080AB37
4 00000080AB3A
180
?
9 00000080AA0C
10 00000080AA0E
4 00000080AA0F
1 00000080AA10
5 00000080AA12
194
?
9 00000080AA0C
5 00000080AA0E
5 00000080AA0F
7 00000080AA10
2 00000080AA12
200
?

想实现的效果:

4 00000080AB34 9 00000080AA0C 9 00000080AA0C
5 00000080AB35 10 00000080AA0E 5 00000080AA0E
5 00000080AB36 4 00000080AA0F 5 00000080AA0F
6 00000080AB37 1 00000080AA10 7 00000080AA10
4 00000080AB3A 5 00000080AA12 2 00000080AA12
180 194 200

思路:

1、先将所有的内容整合成一行
2、将一行内容分割成三行
3、将行和列互转即可

实现:

#先将所有的内容整合成一行
sed ':a;N;$!ba;s/\n/|/g' test.txt

这里写图片描述

#将一行内容分割成三行
sed ':a;N;$!ba;s/\n/|/g' test.txt | awk -F'?' '{print "|"$1"\n"$2"\n"$3}'

这里写图片描述

#将行和列互转,第一列赋给a,第二列赋给b,......
sed ':a;N;$!ba;s/\n/|/g' test.txt | awk -F'?' '{print "|"$1"\n"$2"\n"$3}' | awk -F'|' '{a=a$1" ";b=b$2" ";c=c$3" ";d=d$4" ";e=e$5" ";f=f$6" ";g=g$7" ";}END{print a"\n"b"\n"c"\n"d"\n"e"\n"f"\n"g}'

这里写图片描述

方法二:

#[root@iZbp1bhgh25pacaj2ffmp2Z src]# sed ':a;N;$!ba;s/\n/|/g' test.txt | awk -F'?' '{print "|"$1"\n"$2"\n"$3}' > data   #这种方法要知道是提前知道有多少行
[root@iZbp1bhgh25pacaj2ffmp2Z src]# sed ':a;N;$!ba;s/\n/|/g' test.txt | awk -F '?' '{for(i=1;i<=NF;i++){print $i}}' | sed '1s/^/|/'  > data
[root@iZbp1bhgh25pacaj2ffmp2Z src]# 
[root@iZbp1bhgh25pacaj2ffmp2Z src]# cat data 
|4 00000080AB34|5 00000080AB35|5 00000080AB36|6 00000080AB37|4 00000080AB3A|180|
|9 00000080AA0C|10 00000080AA0E|4 00000080AA0F|1 00000080AA10|5 00000080AA12|194|
|9 00000080AA0C|5 00000080AA0E|5 00000080AA0F|7 00000080AA10|2 00000080AA12|200|
[root@iZbp1bhgh25pacaj2ffmp2Z src]# 
[root@iZbp1bhgh25pacaj2ffmp2Z src]# bash aa.sh 
4 00000080AB34 9 00000080AA0C 9 00000080AA0C
5 00000080AB35 10 00000080AA0E 5 00000080AA0E
5 00000080AB36 4 00000080AA0F 5 00000080AA0F
6 00000080AB37 1 00000080AA10 7 00000080AA10
4 00000080AB3A 5 00000080AA12 2 00000080AA12
180 194 200
[root@iZbp1bhgh25pacaj2ffmp2Z src]# 
[root@iZbp1bhgh25pacaj2ffmp2Z src]# cat aa.sh 
#!/bin/bash
n=1
while true
do
    ((n++))
    str=$(cut -f$n -d'|' < data)
    [[ -z $str ]]&& break || echo $str
done

这里写图片描述

扩展:行列转化

源:
DATE 20180110
00-00 0.11
00-01 1.12
00-02 0.23
00-03 0.82
00-04 0.15

希望转换成:
DATE        00-00        00-01        00-02        00-03        00-04       
20180110        0.11        1.12        0.23        0.82        0.15   


方法一:
#!/bin/bash
n=1
while true
do
    str=$(cut -f$n -d' ' < test.txt)
    [[ -z $str ]]&& break || echo $str
    ((n++))
done

方法二:
#第一列赋给a,第二列赋给b
awk '{a=a$1" ";b=b$2" "}END{print a"\n"b}' test.txt

这里写图片描述

2、一行变成多列

[root@iZbp1bhgh25pacaj2ffmp2Z ~]# echo 1 2 3 4 5 6 | xargs -n1
1
2
3
4
5
6
[root@iZbp1bhgh25pacaj2ffmp2Z ~]# echo 1 2 3 4 5 6 | xargs -n1 -n2
1 2
3 4
5 6
[root@iZbp1bhgh25pacaj2ffmp2Z ~]# echo 1 2 3 4 5 6 | xargs -n1 -n2 -n3
1 2 3
4 5 6
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值