1

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

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

现在我想编写一个 shell 脚本/命令来输出一个包含所有年龄 <25 的缔约方的文件。在这种情况下,它应该打印如下内容:

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 进行选择,这样我的脚本就会打印出 Name = "Shub A" 的 Party 记录。所以这里的输出应该是:

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

5 回答 5

1

尝试:

gawk 'BEGIN{ FIELDWIDTHS = "11 11 19 14" } NR<3 || $1~/^Shub A +$/{print $3}' file
于 2013-03-07T20:23:42.200 回答
1
$ awk '($2+0) < 25{print $3}' input
Party
------------------
USR

更新

各种for循环来确定哪个字段包含数字(n),然后名称在$1..n其中,party-field在$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
于 2013-03-07T15:38:31.670 回答
0

如果你知道你的年龄没有一个能填满 10 位数字,你可以这样做:

< input-file cut -b 11-30 | awk '$1 < 25' | cut -b 11-
于 2013-03-07T16:28:36.267 回答
0

像这样的东西应该工作。它打印前两行(标题),然后比较第二个字段是否低于 25。

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

它产生:

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

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

于 2013-03-07T15:35:23.207 回答
0

试试这个,如果它对你有用:

 awk 'NR<3||($2+0)<25{a[++i]=$3}END{for(x in a)print a[x]}' file
于 2013-03-07T15:35:57.997 回答