Linux 输出文件的某几列并存为新文件

文件有一百多个字段,我想把文件的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

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于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" }
}' 试试。追问

不知道是不是版本问题,会报语法错误,for括号里面的逗号报错。加两层小括号,会报分号的错误。(不知道是不是不支持awk里面带for语句)
试了一下,得把for写在外面,awk语句写在for里面,还得把$(i+1)改成$'"$[i+1]"'的形式。

追答

这是手写的,报错是正常的。
for写在外面awk写在for里面不是awk程序。你不是要用awk实现 ——
把你写的贴上来!

本回答被提问者采纳
相似回答