LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1993|回复: 13

如何插入一列(awk或者gawk)

[复制链接]
发表于 2004-8-13 13:24:28 | 显示全部楼层 |阅读模式
有文件a,内容如下:
---------------------------------
sff fdsf
sdf kiji
abc ljim
dfe lomn
---------------------------------
文件b,内容如下:
---------------------------------
sfe
sdd
abh
dfg
---------------------------------
现欲在a的最后一列(第二列)插入文件b的列,使其成为如下的文件c:
---------------------------------
sff fdsf sfe
sdf kiji sdd
abc ljim abh
dfe lomn dfg
---------------------------------
用sed和awk,如何做到?awk有没有内建的函数可以实现这样的功能?
如果,不用内建的函数,用正则表达式是否可以实现?
:help

:help :help :help :help :help
 楼主| 发表于 2004-8-13 13:31:49 | 显示全部楼层
进一步讲,如何插入多列.
如果文件b的内容如下:
--------------------------
sfe mylove    hello
sdd myfriend  world
abh mymother  linux
dfg mystudent unix
--------------------------
现欲把b的第一列插入a的第一列之前,使b的第一列成为a的第一列;
把b的第二列插入a的第一列之后,使b的第二列成为a的的三列;
把b的第三列插入a的第二列之后,使b的第三列成为a的的五列;
完成后,a的内容如下:
-------------------------------
sfe sff mylove    fdsf  hello
sdd sdf myfriend  kiji  world
abh abc mymother  ljim  linux
dfg dfe mystudent lomn  unix
-------------------------------
用sed和awk如何做到?
方法越多越好。
:help
发表于 2004-8-13 13:57:27 | 显示全部楼层

  1. /home/lee/test#paste a b -d' '
  2. sff fdsf sfe
  3. sdf kiji sdd
  4. abc ljim abh
  5. dfe lomn dfg

复制代码

  1. /home/lee/test#while read -u3 a&&read -u4 b;do echo $a $b;done 3<a 4<b
  2. sff fdsf sfe
  3. sdf kiji sdd
  4. abc ljim abh
  5. dfe lomn dfg
复制代码
 楼主| 发表于 2004-8-13 14:01:26 | 显示全部楼层
可是,如果我不用paste也不用shell命令,只用sed和awk,如何能做到?
我用如下方法,可以合并:
awk '{getline l<"file1";$1=$1" "l;print}' file2
但是第二个文件的某一列在合并后的文件中的位置,却不是我能控制的,
该如何控制?:%
发表于 2004-8-13 14:04:11 | 显示全部楼层
可不可以用别的命令

  1. [shell]$ paste a b | awk '{print $3,$1,$4,$2,$5}'
  2. sfe sff mylove fdsf hello
  3. sdd sdf myfriend kiji world
  4. abh abc mymother ljim linux
  5. dfg dfe mystudent lomn unix
复制代码
发表于 2004-8-13 14:13:21 | 显示全部楼层
把你那一句修了一下:

  1. [shell]$ awk '{getline l<"a";split(l,arr," ");print $1,arr[1],$2,arr[2],$3}' b
  2. sfe sff mylove fdsf hello
  3. sdd sdf myfriend kiji world
  4. abh abc mymother ljim linux
  5. dfg dfe mystudent lomn unix
复制代码
 楼主| 发表于 2004-8-13 14:23:37 | 显示全部楼层
呵呵~~~,谢谢KornLee兄和doubleelec兄,         
这下,我可随意控制合并后,每列的顺序了,只要改变:
$ awk '{getline l<"a";split(l,arr," ");print $1,arr[1],$2,arr[2],$3}' b
中, $1, arr[1], $2,arr[2],$3的顺序即可。
再次谢谢KornLee兄和doubleelec兄。
发表于 2004-8-13 14:32:36 | 显示全部楼层
谢谢 najia01,看到你那一句之前我也不知道可以这么搞
 楼主| 发表于 2004-8-13 14:45:45 | 显示全部楼层
再进一步讲,如果有3个文件,甚至4个文件,
现假设有3个文件,分别为i,j, k
i的内容如下:
----------------------------------
iiii jjjj
iiii jjjj
iiii jjjj
iiii jjjj
----------------------------------
j的内容如下:
----------------------------------
hhhh oooo
hhhh oooo
hhhh oooo
hhhh oooo
----------------------------------
k的内容如下:
----------------------------------
kkkk llll mmmm
kkkk llll mmmm
kkkk llll mmmm
kkkk llll mmmm
----------------------------------
可用如下语句:

awk "{getline l<\"i\";split(l,arr,FS);getline t<\"j\";split(t,brr,FS);print $1,arr[1],$2,arr[2],$3,brr[1],brr[2]}" k

但是合并完后,文件内容如下:
---------------------------------------------------------------------
kkkk iiii llll jjjj mmmm hhhh oooo
kkkk iiii llll jjjj mmmm hhhh oooo
kkkk iiii llll jjjj mmmm hhhh oooo
kkkk iiii llll jjjj mmmm hhhh oooo
iiii  jjjj
---------------------------------------------------------------------
为什么会多出第5行的"iiii  jjjj"呢?
发表于 2004-8-13 14:59:30 | 显示全部楼层
晕倒ed 我个人认为还是要找出其中的规律!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表