我试图让awk在每个4之后打印第一列,第二列和一列(例如1,2,6,10等)。我还想删除第二行,因为这是一个不重要的标题。最后,我想根据第一列的值(作为字符串向量提供)过滤行。
让我们举个例子,说我只想要匹配'table'或'chair'的行:
string number1 junk1 junk2 junk3 number2 junk4 junk5 junk6 number3
junk7 junk8 junk9 junk10 junk11 junk12 junk13 junk14 junk15 junk16
car 7 x1 x5 x9 3 x13 x17 x21 11
table 8 x2 x6 x10 5 x14 x18 x22 2
chair 9 x3 x7 x11 4 x15 x19 x23 6
comb 0 x4 x8 x12 1 x16 x20 x24 10
我希望将此作为输出
string number1 number2 number3
table 8 5 2
chair 9 4 6
由于
答案 0 :(得分:2)
如果您的列数限制为10
awk 'BEGIN{OFS="\t"} NR!=2 && /table/ || /chair/ || NR==1{print $1,$2,$6,$10}'
如果列数未知,或者枚举太多,则可以执行此操作。
awk 'BEGIN{OFS="\t"} NR!=2 && /table/ || /chair/ || NR==1{line=$1 OFS $2; for(i=6;i<=NF;i+=4)line=line OFS $i; print line}'
您还可以将过滤器外部化为变量,例如
awk -v filter="chair table" 'BEGIN{OFS="\t"} NR==1 || (NR!=2 && (filter ~ $1)) {line=$1 OFS $2; for(i=6;i<=NF;i+=4)line=line OFS $i; print line}'
答案 1 :(得分:2)
$ awk -v keys='table|chair' 'NR==1 || (NR>2 && $1~"^("keys")$") {out=$1; for (i=2;i<=NF;i+=4) out = out OFS $i; print out}' file
string number1 number2 number3
table 8 5 2
chair 9 4 6
以上假设您的密钥不包含RE元字符,如果他们可以编辑您的问题以显示该问题,那么您将需要一个不同的解决方案。