3

我有一个用以下列格式分隔的日志文件:

<date>  <time> | <fruit> | <color> | <num_1> | <num_2> | <num_3>

例如:

2013-03-27  23:01:52 | apple | green | 55 | 120 | 29
2013-03-27  23:01:56 | plumb | purple | 28 | 1 | 394
2013-03-27  23:01:59 | apple | red | 553 | 21 | 7822

我想编写一个 perl 脚本(尽管 python 或 bash 也是可以接受的),greps该脚本在<date>and<time>字段(第 1 列)和或<num_1>,取决于您给脚本的输入。因此,在上述信息上运行会给你,并且:<num_2><num_3>perl extract.pl 2<date><time><num_2>

2013-03-27  23:01:52 | 120
2013-03-27  23:01:56 | 1
2013-03-27  23:01:59 | 21

我尝试了以下方法,但似乎不起作用:

#!/usr/bin/perl

use warnings;
use strict;

my $col = $1;

print `grep "myapplog.txt" "m/_(\d{4})(\d\d)(\d\d)/ | $col"`

在这里,我将colvar 设置为脚本的第一个 arg,然后尝试打印与第一列和需求<num_X>列的日期时间匹配的 grep。有任何想法吗?提前致谢。

4

2 回答 2

4

尝试在 awk 模式下使用 perl

$ perl -F'\|' -lane 'print $F[0]," | ", $F[4]' input
2013-03-27  23:01:52  |  120 
2013-03-27  23:01:56  |  1 
2013-03-27  23:01:59  |  21 

纯awk:

awk -F"|" '{print $1, "|", $5}' input

纯重击:

#!/bin/bash

IFS="|"

while read -a ARRAY;
do
    echo ${ARRAY[0]} "|" ${ARRAY[4]}
done < input

更新

例如,将参数传递给 awk 解决方案以确定要打印的女巫列,使用:

$ awk -vcol="5" -F"|" '{print $1, "|", $col}' input

在 bash 中,函数/脚本的第一个参数位于其中,$1因此将其用作 ARRAY 的索引。

使用 python 比单线更正式的东西:

#!/usr/bin/env python

import sys

col = raw_input('which column to print? -> ')
try:
    col = int(col)
except ValueError:
    print >> sys.stderr, "That was no integer"

with open("input") as fd:
    for line in fd:
        tmp = line.strip().split('|')
        print tmp[0], "|", tmp[col]
于 2013-04-03T20:00:36.110 回答
1

尝试这样做

使用您希望的第一个参数(使用@ARGV数组,而不是$1in perl):

#!/usr/bin/perl

use warnings; use strict;
use autodie; # No need to check open() errors

$\ = "\n";   # output record separator (no need \n)

# file-handle
open my $fh, "<", "myapplog.txt";

chomp(my $col = $ARGV[0]);

die("Not an integer !\n") unless $col =~ /^\d+$/;

# using the famous and magical <diamond> operator:
while (<$fh>) {
    chomp;
    my @F = split /\|/; # splitting current line in @F array
    print join("|", @F[0,$col+2]); # join on a array slice
}

close $fh;
于 2013-04-03T20:12:23.233 回答