Linux-awk文本文件处理

Linux-awk文本文件处理,linux,awk,text-processing,Linux,Awk,Text Processing,我有一个包含几千行数据的文件,每一行都像:a:b:c:d 例如: 0.0:2000.00:2000.04:2000.02 我想把所有的a都放在一个文件里,b在第二个文件里,等等。怎么做?看看(或)手册 您应该使用-F:标志将字段分隔符设置为: 您应该将打印与>文件一起使用,以获得所需文件的输出 awk -F: '{ for (i = 1; i <= NF; i++) { file = "file." i; print $i > file; } }' input awk-F:'{f

我有一个包含几千行数据的文件,每一行都像:
a:b:c:d

例如:

0.0:2000.00:2000.04:2000.02
我想把所有的a都放在一个文件里,b在第二个文件里,等等。怎么做?

看看(或)手册

您应该使用
-F:
标志将字段分隔符设置为

您应该将
打印
>文件
一起使用,以获得所需文件的输出

awk -F: '{ for (i = 1; i <= NF; i++) { file = "file." i; print $i > file; } }' input
awk-F:'{for(i=1;i file;}}}'输入
awk
在Mac OS X 10.7.4上不允许使用表达式作为文件名;
gawk
允许使用表达式。所示的解决方案将适用于这两种情况。)

[为反对(现在取消了,谢谢)无缘无故错误的否决票而做的家庭作业的答案!]

查看(或)手册

您应该使用
-F:
标志将字段分隔符设置为

您应该将
打印
>文件
一起使用,以获得所需文件的输出

awk -F: '{ for (i = 1; i <= NF; i++) { file = "file." i; print $i > file; } }' input
awk-F:'{for(i=1;i file;}}}'输入
awk
在Mac OS X 10.7.4上不允许使用表达式作为文件名;
gawk
允许使用表达式。所示的解决方案将适用于这两种情况。)

[为反对(现在取消了,谢谢)毫无理由错误的否决票而做的家庭作业的答案!]

关于:

cat filename|cut -d ':' -f1 > a.txt
然后,您可以为第二个字段写入-f2并将其放入b.txt中。

关于:

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

然后,您可以为第二个字段写入-f2,并将其放在b.txt中。

单向。输出文件将命名为fileX,每个列编号都有X

假设使用内容填充

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
结果如下:

==> 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

==>file1 file2 file3 file4单向。输出文件将被命名为fileX,每个列编号为X

假设使用内容填充

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
结果如下:

==> 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

==>file1 file2 file3 file4@tripleee:
cut
不会在数据的一次传递中执行I/O重定向。对于小文件,重新扫描无关紧要。对于管道(无文件)或大文件,可能会这样做(当然,管道中有“无文件”的方法).@tripleee:
cut
不会在数据的一次传递中执行I/O重定向。对于小文件,重新扫描无关紧要。对于管道(无文件)或大文件,可能会这样做(当然,管道中有“无文件”的方法)。您可以这样做(使用
cut
4次);它涉及4个字段的4次文件传递,如果文件存在且很小,这没有多大关系,但是如果没有文件(例如,这是在管道中生成的结果),或者如果文件很大(对于合适的大定义,它可能以兆字节的倍数度量),则会成为一个麻烦。你还赢得了一个奖项。是的,我明白了!当然,如果它不是文件,而是数据流之类的东西,你就不能使用它。但这不是问题。对于非常大的文件,你是对的,这是浪费时间。Ps:真是一个有趣的奖项!你可以这样做(使用
cut
4次);它涉及4个字段的4次文件传递,如果文件存在且很小,这没有多大关系,但是如果没有文件(例如,这是在管道中生成的结果),或者如果文件很大(对于合适的大定义,它可能以兆字节的倍数度量),则会成为一个麻烦。你还赢得了一个奖项。是的,我明白了!当然,如果它不是一个文件,而是一个数据流之类的东西,你就不能使用它。但这不是问题。对于非常大的文件,你是对的,这是浪费时间。Ps:真的是一个有趣的奖项!不错,但是一行代码的11行脚本有点多余。不错,但是一行代码的11行脚本是bi不要过分。