我有一个格式为固定长度的文件:
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
答案 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-