Linux 输出文件的某几列并存为新文件
文件有一百多个字段,我想把文件的1到4字段另存到file1,5到8字段另存到file2,9到12字段另存到file3,依次类推。用awk怎么实现啊?最好能有循环自动完成。...
文件有一百多个字段,我想把文件的1到4字段另存到file1,5到8字段另存到file2,9到12字段另存到file3,依次类推。用awk怎么实现啊?最好能有循环自动完成。别的命令也可以。
展开
展开全部
#!/bin/bash
TotalFields=$(awk '{print NF}' file.txt|sort -nr|head -1) #获取file.txt的最大字段数量,假定文件名为 file.txt
k=1
for((i=1;i<=$TotalFields;i+=1))
do
cut -d" " -f${i}-$(((i+=3))) file.txt>file${k} #-d后为各字段的分隔符,自己根据实际情况指定
((k++))
done
举个例子:
[root@localhost ~]# cat file.txt
aa bb cc dd ee ff gg cc dd o k g ookk
ca bb cc ddd dee fff dgg fcc ddd o k g ookk
aa abb dcc add ee ff gg cc dd do k g ookk
aaa bb cc ddd ebe fff dgg ccf dd o dk g ookk
aa bb cyc dd ee ff gg ccd ddd o fk g ookk
[root@localhost ~]# cat test.sh
#!/bin/bash
TotalFields=$(awk '{print NF}' file.txt|sort -nr|head -1)
k=1
for((i=1;i<=$TotalFields;i+=1))
do
cut -d" " -f${i}-$(((i+=3))) file.txt>file${k}
((k++))
done
[root@localhost ~]# ./test.sh
[root@localhost ~]# ls
anaconda-ks.cfg cstudy Desktop file1 file2 file3 file4 file.txt install.log install.log.syslog jdk-6u45-linux-x64.bin test.sh VBoxLinuxAdditions.run Work
[root@localhost ~]# cat file1
aa bb cc dd
ca bb cc ddd
aa abb dcc add
aaa bb cc ddd
aa bb cyc dd
[root@localhost ~]# cat file2
ee ff gg cc
dee fff dgg fcc
ee ff gg cc
ebe fff dgg ccf
ee ff gg ccd
[root@localhost ~]# cat file3
dd o k g
ddd o k g
dd do k g
dd o dk g
ddd o fk g
[root@localhost ~]# cat file4
ookk
ookk
ookk
ookk
ookk
推荐于2016-04-14
展开全部
cat FILE |
awk -F'分隔符' '{ for(i=1,j=1; i<NF; i+=4,j++)
{ print $(i),$(i+1),$(i+2),$(i+3)>"file$j" }
}' 试试。
awk -F'分隔符' '{ for(i=1,j=1; i<NF; i+=4,j++)
{ print $(i),$(i+1),$(i+2),$(i+3)>"file$j" }
}' 试试。
追问
不知道是不是版本问题,会报语法错误,for括号里面的逗号报错。加两层小括号,会报分号的错误。(不知道是不是不支持awk里面带for语句)
试了一下,得把for写在外面,awk语句写在for里面,还得把$(i+1)改成$'"$[i+1]"'的形式。
追答
这是手写的,报错是正常的。
for写在外面awk写在for里面不是awk程序。你不是要用awk实现 ——
把你写的贴上来!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |