首页 > 学技术 > 技术网文 > Linux Shell > 正文

[保留] 文本行横竖转换


来源 chinaunix.net 酷勤网整理

请问如何用SED将: 

1 2 3 4 5 6 7 8 9
A B C D E F G H I 

变化为:
1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
9 I
谢谢了..
请各位哥哥帮帮忙..

[ 本帖最后由 mocou 于 2006-1-13 09:40 编辑 ]



 大蚂蚁 回复于:2006-01-11 19:51:01

郁闷,发不了帖子。。。 :(

^_^ 好像又可以了

holdspace不行么?第一行逐个放进去,第二行的时候逐个取出来? 
sed还得跟美女多学习

[ 本帖最后由 大蚂蚁 于 2006-1-11 19:52 编辑 ]


 寂寞烈火 回复于:2006-01-11 19:52:42

引用:原帖由 大蚂蚁 于 2006-1-11 19:51 发表
郁闷,发不了帖子。。。 :( 


郁闷,不会 
把每一行放到数组里,然后对所有数组循环,应该可以


 dbcat 回复于:2006-01-11 19:57:32


TO 大蚂蚁:
我试过了啊...可是不行.

TO 烈火:
呵呵,用AWK是可以的啦 ....不过我想用SED来办.
 
如果能变成:
1
A
2
B
3
C
...
也行萨.


 寂寞烈火 回复于:2006-01-11 20:02:05

引用:原帖由 dbcat 于 2006-1-11 19:57 发表

TO 大蚂蚁:
我试过了啊...可是不行.

TO 烈火:
呵呵,用AWK是可以的啦 ....不过我想用SED来办

AWK我也不会 


 dbcat 回复于:2006-01-11 20:05:23

引用:原帖由 寂寞烈火 于 2006-1-11 20:02 发表

AWK我也不会  



请看:

http://bbs.chinaunix.net/viewthread.php?tid=218320&highlight=admirer


 寂寞烈火 回复于:2006-01-11 20:16:01

引用:原帖由 dbcat 于 2006-1-11 20:05 发表


请看:

http://bbs.chinaunix.net/viewthread.php?tid=218320&highlight=admirer 


这个我知道,我在考虑用别的方法 ~~


 寂寞烈火 回复于:2006-01-12 03:33:40

引用:原帖由 dbcat 于 2006-1-11 19:57 发表

TO 大蚂蚁:
我试过了啊...可是不行.

TO 烈火:
呵呵,用AWK是可以的啦 ....不过我想用SED来办

用shell来解决,如何?
引用:
/home/lee#cat file
1 2 3 4 5 6 7 8 9 0
A B C D E F G H I J
2 3 4 5 6 7 8 9 0 1
B C D E F G H I J K
3 4 5 6 7 8 9 0 1 2
C D E F G H I J K L


/home/lee#cat _test
#!/bin/ksh
#假定固定文件是10个域
n=1
while read line;do
        set -A array$n $line
        ((n++))
done<file
varlist=$(
for j in $(typeset);do
        [[ $j == array[0-9] ]] && echo \${$j[\$m]}
        done
)
m=0
while((m<=10));do
        eval echo $varlist
        ((m++))
done
 
result引用:
/home/lee#_test
1 A 2 B 3 C
2 B 3 C 4 D
3 C 4 D 5 E
4 D 5 E 6 F
5 E 6 F 7 G
6 F 7 G 8 H
7 G 8 H 9 I
8 H 9 I 0 J
9 I 0 J 1 K
0 J 1 K 2 L
 




 faintblue 回复于:2006-01-12 08:07:26

# cat 1

1 2 3 4 5 6 7 8 9
A B C D E F G H I
1 2 3 4 5 6 7 8 9
a b c d e f g h i
1 2 3 4 5 6 7 8 9
A B C D E F G H I


# cat a

:a
H;ta
$ {
x
s/\n/ @/g
s/$/ /
s/ //
x
:b
g
s/ [^@]*$//
s/ [^@]*@/ /g
s/@//
p
g
s/@../@/g
h
/@@/!tb
}


# sed -n -f a 1


1 A 1 a 1 A
2 B 2 b 2 B
3 C 3 c 3 C
4 D 4 d 4 D
5 E 5 e 5 E
6 F 6 f 6 F
7 G 7 g 7 G
8 H 8 h 8 H
9 I 9 i 9 I



 waker 回复于:2006-01-12 09:12:22

与tainblue思路基本一样,不过是一个个字符为单位的

[waker@proxy d1]$ cat file
123456
abc
ABCDE
hijk
lmnopqrstuvw


[waker@proxy d1]$ sed -n 'H;${:a;

g;
s/\n[^\n]/\n/g; 
:b;
/[^\n]/s/\n\n/\n \n/g;tb;
x;
s/\n\+\([^\n]\)[^\n]*/\1/gp;ta}' file


结果

1aAhl
2bBim
3cCjn
4 Dko
5 E p
6   q
    r
    s
    t
    u
    v
    w


当然部分不支持\n的用户不能通过


 waker 回复于:2006-01-12 09:22:28

改的好读一点儿吧

H            #保存所有行
${          #最后一行处理,与AWK的END相似
:a
g            #取得保留空间内容
s/\n[^\n]/\n/g       #把第一个不是换行符删除
:b                                      #与下面一句形成循环
/[^\n]/s/\n\n/\n \n/g;tb    #其实是补位用的
x                                       #交换保留/模式空间内容,这时保留空间已经没有每"行"的第一个字符了
s/\n\+\([^\n]\)[^\n]*/\1/gp;ta   #打印出模式空间的所有"行"的第一个字符,再去:a处处理保留空间的内容
}



 faintblue 回复于:2006-01-12 11:12:52

引用:原帖由 waker 于 2006-1-12 09:12 发表
... 当然部分不支持\n的用户不能通过 ... 



Yes, many sed versions don't support \n as a replacement.


 r2007 回复于:2006-01-12 11:41:11

空行没有考虑吧?
1234567

drmfslx


 r2007 回复于:2006-01-12 12:02:36

引用:原帖由 faintblue 于 2006-1-12 11:12 发表


Yes, many sed versions don't support \n as a replacement. 


这样是否移植性更好?
sed -n 'H;${:a;

g;
s/\(\n\)[^\n]/\1/g;
:b;
/[^\n]/s/\(\n\)\1/\1 \1/g;tb;
x;
s/\n\+\([^\n]\)[^\n]*/\1/gp;ta}'



 r2007 回复于:2006-01-12 12:09:19

加了一行就出问题了

cat file

123456
abc
ABCDE
hijk
lmnopqrstuvw
^_^

结果
1aAhl^

2bBim_
3cCjn^
4 Dko

5 E p

6   q

    r

    s

    t

    u

    v

    w



 waker 回复于:2006-01-12 12:26:08

空行好解决
最前面加 
/^$/s// /

多换行的问题还得考虑


 faintblue 回复于:2006-01-12 12:35:48

引用:原帖由 r2007 于 2006-1-12 12:02 发表

这样是否移植性更好?

s/\n\[color=Red]+[/color]\([^\n]\)[^\n]*/\1/gp;ta}'



+ is bad for 移植性.


 waker 回复于:2006-01-12 13:01:56

再修订一次吧,虽然不能满足所有sed版本
不过感觉还有修改空间
sed -n '/^$/s// /

H
${
:a
g
s/\(\n\)[^\n]/\1/g
:b
/[^\n]/s/\(\n\)\1/\1 \1/g
tb
x;
s/\n\n*\([^\n]\)[^\n]*/\1/g
s/\n//g
/[^\n]/{p;ba}
}' file



 dbcat 回复于:2006-01-12 17:12:23

感谢蚂蚁,烈火,FAINTBLUE , WAKER ,R2007 的无私帮助!
问题圆满解决!
向你们致敬!

[ 本帖最后由 dbcat 于 2006-1-12 17:13 编辑 ]


 大蚂蚁 回复于:2006-01-12 18:14:39

呵呵,我是来学习的,建议美女把帖子改个名字,以后方便查阅


 macrodba 回复于:2006-01-25 16:53:21

学习ing  


 pqxpqx 回复于:2006-12-11 17:03:57

学习!


 letwave 回复于:2006-12-11 23:39:57

LZ mm is a SiChuan girl.


 awk就是awp加ak 回复于:2006-12-12 09:06:17

引用:原帖由 letwave 于 2006-12-11 23:39 发表
LZ mm is a SiChuan girl. 


 错~


 li.he 回复于:2006-12-12 15:39:36

都是武林高手


 awk就是awp加ak 回复于:2006-12-14 09:25:49

其中假设行最大长度 255,文本没有分隔符 #, %
sed -n '

1 {
x
:init
s-^.\{0,255\}$-#&-
t init
x
}

H
g
s-\n--
:loop
s-#\([^#]*\)\(.*#\)\([^#]\)\([^#]*\)$-%\1\3 \2\4-
t loop
s-%-#-g

$!h
${
s-^#*--
s-#*$--
p
}
' urfile |tr '#' '\n'


人面不知何处去~ :mrgreen:




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=687057
转载请注明作者名及原文出处



收藏本页到: