【问题标题】:Linux awk text file processingLinux awk 文本文件处理
【发布时间】:2012-08-09 03:09:00
【问题描述】:

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

例如:

0.0:2000.00:2000.04:2000.02

我想在一个文件中获取所有 a,在第二个文件中获取 b,等等。如何?

【问题讨论】:

    标签: linux awk text-processing


    【解决方案1】:

    一种方式。输出文件将被命名为 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
    

    【讨论】:

    • 不错,但是 11 行的单行脚本有点过分了。
    【解决方案2】:

    查看awk(或gawk)手册。

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

    您应该使用print&gt; file 来获得所需文件的输出。

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

    (Mac OS X 10.7.4 上的awk 不允许将表达式作为文件名;gawk 允许。显示的解决方案适用于两者。)

    [针对 IMNSHO 无偿错误的反对(现已取消——谢谢)反对票的家庭作业的答案!]

    【讨论】:

    • @tripleee: cut 不会在一次数据传递中执行 I/O 重定向。对于小文件,重新扫描无关紧要。对于管道(无文件)或大文件,它可能(当然,在管道中有解决“无文件”的方法)。
    【解决方案3】:

    怎么样:

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

    然后你可以为第二个字段写-f2,并把它放在b.txt中。

    【讨论】:

    • 你可以这样做(使用cut 4次);它涉及对 4 个字段的文件进行 4 次传递,如果文件存在且很小,这无关紧要,但如果没有文件(例如,它是在管道中生成的结果),则变得很麻烦,或者如果文件很大(对于大的合适定义,可能以兆字节的倍数衡量)。您还赢得了UUOC 奖。
    • 是的,我明白了!当然,如果它不是文件,而是数据流之类的东西,则不能使用它。但这不是问题。对于非常大的文件,你是对的,这是浪费时间。 ps:真是个搞笑的奖项!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多