使用awk打印第一列,第二列,然后每3列打印一个,并仅打印符合条件的行

时间:2015-08-11 21:23:48

标签: awk

我试图让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

由于

2 个答案:

答案 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元字符,如果他们可以编辑您的问题以显示该问题,那么您将需要一个不同的解决方案。