将每3个列的副本集复制到unix中的新文件

时间:2016-09-28 18:15:19

标签: loops unix awk

我有一个包含30列的文件(重复的ID名称和地点),我需要每次提取3列,并且每次都将它们放入一个新文件中:

ID Name Place ID Name Place ID Name Place ID Name place ...
19 john  NY  23 Key NY 22 Tom Ny 24 Jeff NY....
20 Jen NY 22 Jill NY 22 Ki LA 34 Jack Roh ....

所以我将有10个这样的文件 -

Output1.txt

ID Name Place 
19 john NY 
20 Jen NY 

Output2.txt

ID Name Place 
23 Key NY
22 Jill NY 

还有8个这样的文件。我可以打印像 awk '{print $1,$2,$3}' Input.txt > Output1.txt但对于10个文件来说可能过于繁琐。反正我还能加快速度吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

$ awk '{for (i=1;i<=NF;i+=3) {print $i,$(i+1),$(i+2) > ("output" ((i+2)/3) ".txt")}}' file.txt

#  output1.txt
ID Name Place
19 john NY
20 Jen NY

#  output2.txt
ID Name Place
23 Key NY
22 Jill NY

#  output3.txt
ID Name Place
22 Tom Ny
22 Ki LA

#  output4.txt
ID Name place
24 Jeff NY
34 Jack Roh

答案 1 :(得分:3)

从这个精彩的Ed Morton's answer

中稍微调整一下
awk -v d=3 '{sfx=0; for(i=1;i<=NF;i+=d) {str=fs=""; for(j=i;j<i+d;j++) \ 
      {str = str fs $j; fs=" "}; print str > ("output_file_" ++sfx)} }' file

将根据您的要求分割文件。

请记住,awk变量d定义要拆分的列数,在您的情况下为3。

答案 2 :(得分:1)

$ awk '{for(i=0;i<=NF/3-1;i++) print $(i*3+1), $(i*3+2), $(i*3+3)>i+1".txt"}' file
$ cat 1.txt
ID Name Place
19 john NY
20 Jen NY