2012-08-12 37 views
1

我有幾千行數據的文件,每一行是這樣的:a:b:c:dLinux的AWK文本文件處理

因此,例如:

0.0:2000.00:2000.04:2000.02 

我想全部在一個文件,b在第二檔等等。怎麼樣?

回答

6

單程。輸出文件將命名爲fileX,其中X爲每列編號。

假設INFILE與內容:

0.0:2000.00:2000.04:2001.02 
0.1:2002.00:2000.05:2003.02 
0.2:2003.00:2002.04:2004.02 
0.3:2001.00:2000.05:2000.03 
0.3:2001.00:2000.04:2001.02 
0.2:2001.00:2002.04:2000.02 

執行此命令awk

awk ' 
    BEGIN { 
     FS = ":"; 
    } 

    { 
     for (i = 1; i <= NF; i++) { 
      print $i > "file" i; 
     } 
    } 
' infile 

檢查輸出文件:

head file[1234] 

有了結果如下:

==> file1 <== 
0.0 
0.1 
0.2 
0.3 
0.3 
0.2 

==> file2 <== 
2000.00 
2002.00 
2003.00 
2001.00 
2001.00 
2001.00 

==> file3 <== 
2000.04 
2000.05 
2002.04 
2000.05 
2000.04 
2002.04 

==> file4 <== 
2001.02 
2003.02 
2004.02 
2000.03 
2001.02 
2000.02 
+2

不錯,但是11行腳本的腳本有點過分。 – 2012-08-12 19:31:20

4

看看awk(或gawk)手冊。

您應該使用-F:標誌將字段分隔符設置爲:

您應該使用print> file來獲得輸出到您想要的文件。

awk -F: '{ for (i = 1; i <= NF; i++) { file = "file." i; print $i > file; } }' input 

awk Mac OS X上10.7.4不允許的表達式作爲文件名; gawk並示出該解決方案將在兩個工作)

[回答爲作業給予對抗一個(現在取消 - 謝謝你)倒票,這是IMNSHO無償錯誤!]

+0

或者'男人剪'也許。 – tripleee 2012-08-12 19:11:18

+0

@tripleee:'cut'不會在單個數據中執行I/O重定向。對於小文件,重新掃描並不重要。對於管道(無文件)或大文件,它可能會(儘管在管道中有'無文件'的方法)。 – 2012-08-12 19:20:57

+1

+1來對付恕我直言的輕蔑downvote。 – tripleee 2012-08-12 19:27:47

0

什麼:

cat filename|cut -d ':' -f1 > a.txt 

然後你就可以寫爲-f2第二場並把它放在b.txt。

+0

你可以做到這一點(使用'cut'4次);它涉及4個字段的文件傳遞,如果文件存在並且很小,這並不重要,但如果沒有文件(例如,它是在管道中生成的結果),則會變成討厭的文件,或者如果文件很大(對於大的合適的定義,可能以兆字節的倍數來衡量)。您還贏得了[UUOC](http://www.catb.org/jargon/html/U/UUOC.html)獎。 – 2012-08-12 19:25:20

+1

'貓'沒用。 http://partmaps.org/era/unix/award.html – tripleee 2012-08-12 19:28:30

+0

是的,我明白了!當然,如果它不是一個文件,而是像一串數據一樣,你不能使用它。但這不是問題。對於非常大的文件你是對的,這是浪費時間。 Ps:真是一個有趣的獎項! – 2012-08-12 19:33:44