2012-08-12 41 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