在shell中解析平面文件

时间:2013-03-07 15:31:59

标签: parsing shell unix awk fixed

我有一个格式为固定长度的文件:

Name       Age        Party              Role 
---------- ---------- ------------------ --------------
Shubham    27         XYZ                User
Drek       28         ABC                Admin
Raj        23         USR                User

现在我想编写一个shell脚本/命令来输出一个包含Age <25的所有Party的文件 在这种情况下,它应该打印这样的东西:

Party
-----------------
USR

我是awk和shell的新手。我尝试使用awk和substr,但由于我的文件很大(> 200000行有多列),所以它太贵了。有没有一个巧妙的方法来做到这一点?

更新

任何字段都可以包含空格。真正的想法是文件是固定长度的文件。因此每条记录的长度是固定的(名称:10,年龄:10,部分:20,角色:10)。然而,记录可以包含任何数据,包括空格和空格。例如:

Name       Age        Party              Role 
---------- ---------- ------------------ --------------
Shub A     27         XYZ & A            User
Drek GH    28         ABC & C            Admin
Raj        23         USR                User

等等。 现在我想使用Name进行选择,这样我的脚本就会打印出Party记录,其中Name =“Shub A”。所以输出应该是:

Party
-------------------
XYZ & A

5 个答案:

答案 0 :(得分:1)

$ awk '($2+0) < 25{print $3}' input
Party
------------------
USR

<强>更新

各种for循环用于确定包含数字(n)的字段,然后名称位于$1..n且派对字段位于$n+1..NF-1

/Shub A/ {
    # determine which field that contains a number
    for (i=1;i<NF;i++) {
        if ($i ~ /[0-9]+$/) {
            break
        }
    }
    for (j=1;j<i;j++) {
        printf "%s ", $j
    }
    for (k=(i+1);k<NF;k++) {
        printf "%s ", $k
    }

}

输出:

Shub A XYZ & A 

...或者您可以尝试拆分“2个或更多个空格”,即

$ awk -F"  +" '/^Shub/{print $3}' input
XYZ & A

答案 1 :(得分:1)

尝试:

gawk 'BEGIN{ FIELDWIDTHS = "11 11 19 14" } NR<3 || $1~/^Shub A +$/{print $3}' file

答案 2 :(得分:0)

这样的事情应该有效。它打印前两行(标题),然后比较第二个字段是否低于25。

awk 'FNR < 3 || $2 < 25 { print $3 }' infile

它产生:

Party
------------------
USR

编辑:这是在更新之前发布的,并不适用于它。看一看其他答案

答案 3 :(得分:0)

试试这个,如果适用于你:

 awk 'NR<3||($2+0)<25{a[++i]=$3}END{for(x in a)print a[x]}' file

答案 4 :(得分:0)

如果你知道你的年龄都没有填满整数10位数,你可以这样做:

< input-file cut -b 11-30 | awk '$1 < 25' | cut -b 11-