2016-09-28 13 views
1

我有一個包含30列(重複的ID名稱和位置)的文件,我需要在每次提取3列時將它們放入一個新文件中:將每3個colums的設置複製到unix中的新文件中

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個文件來說可能太麻煩。無論如何,我可以讓它變得更快嗎?

謝謝!

+1

查看https://www.gnu.org/software/gawk/manual/html_node/Redirection.html,其中顯示瞭如何從awk而不是shell進行重定向。 –

回答

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 
+0

Upvoted!爲了比我的簡單。 – Inian

+0

非常感謝jas!這樣一個整潔有效的解決方案,我也試圖得到類似的循環,但它不工作。太棒了。 – AnkP

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的列的數量。

+0

Upvoted!作爲比我更廣泛的解決方案。 – jas

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 
+0

非常感謝詹姆斯! – AnkP

相關問題