Chinaunix

标题: 文本变换 [打印本页]

作者: zhkun    时间: 2006-12-07 16:58
标题: 文本变换
有一文本a.txt

12345|94738||
23459|02839||


把上面的文本变成如下:即每一行下面新增一行,11000和20060101是固定的数字,增加到每一行的下面
12345|94738||
12345|11000|20060101|
23459|02839||
23459|11000|20060101|

那么,如果20060101是一个变量又怎么写?
谢谢!!!
作者: tiancongxin    时间: 2006-12-07 19:13
#!/bin/bash
obj='12345|11000|20060101|'
while read line
do
        printf "$line\n"
        printf "${obj}\n"
done<a.txt
作者: wayy2008    时间: 2006-12-07 19:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: 月波无漾    时间: 2006-12-07 19:42
awk -F"|" -v tmp="|11000|20060101|" '{print $0;print $1,tmp}' test.txt
作者: enjoy48    时间: 2006-12-08 08:52
昨天不是问过了吗,昨天的回帖已经有答案了阿
作者: zhkun    时间: 2006-12-08 08:59
原帖由 enjoy48 于 2006-12-8 08:52 发表
昨天不是问过了吗,昨天的回帖已经有答案了阿


最终文本没有变成下面形式
12345|94738||
12345|11000|20060101|
23459|02839||
23459|11000|20060101|

而是变成
12345|94738||n12345|11000|20060101|
12345|01937|20050506|
12345|08902|20050507|
23459|02839||n23459|11000|20060101|
23459|08923|20050505|
23459|03045|20050506|
23459|00849|20050507|
23459|02394|20050508|
23459|09320|20050509|

多余的行没有去掉,要增加的行,没有增加到相应的位置,且多了一个n。
请指点,谢谢!
作者: Edengundam    时间: 2006-12-08 09:14
原帖由 zhkun 于 2006-12-8 08:59 发表


最终文本没有变成下面形式
12345|94738||
12345|11000|20060101|
23459|02839||
23459|11000|20060101|

而是变成
12345|94738||n12345|11000|20060101|
12345|01937|20050506|
12345|08902|20050 ...



try:



  1. sed -n '/||$/s/^\([^|]*\).*$/&\n\1|11000|'"$time"'|/p'
复制代码


如果有n 用这个


  1. sed -n '/||$/s/^\([^|]*\).*$/&\
  2. \1|11000|'"$time"'|/p'
复制代码

作者: zhkun    时间: 2006-12-08 10:03
sed -n '/||$/s/^\([^|]*\).*$/&\
\1|11000|'"$time"'|/p'

这样就可以了,为什么要加一个回车呢?
整个的可以解释一下吗?
(若不解释,就是我使用也不明白什么意思呀)
作者: 寂寞烈火    时间: 2006-12-08 10:16

  1. while read line;do echo $line;echo ${line%%|*}"|11000|20060101|";done <urfile
复制代码

作者: Edengundam    时间: 2006-12-08 10:38
原帖由 zhkun 于 2006-12-8 10:03 发表
sed -n '/||$/s/^\([^|]*\).*$/&\
\1|11000|'"$time"'|/p'

这样就可以了,为什么要加一个回车呢?
整个的可以解释一下吗?
(若不解释,就是我使用也不明白什么意思呀)



-n 抑制默认输出, sed & awk 上关于 sed 的默认输出行为讲的很明白.

如果以 || 结尾的行, 执行 s 命令.
^\([^|]*\).*$  正则表达式应用啦. 把从行首开始的所有不是 | 的字符都放在第一个组里面.

&\
\1|11000|20060101| 这两行的意思: & 代表前面正则表达式匹配的所有东西. 然后添加一个换行符号( 根据sed的不同版本, 有些sed支持\n, 有些就要像这里的用\来换行...) \1 是反向引用第一个组的内容.

p 是 s 的符号位, 提示, 如果执行了 s 命令, 则输出.

[ 本帖最后由 Edengundam 于 2006-12-8 10:40 编辑 ]
作者: zhkun    时间: 2006-12-08 14:40
谢谢!!!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2