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

使用awk打印第一列、第二列和此后每3列打印一列,并仅打印符合条件的行,awk,Awk,我试图让awk打印第一列、第二列和之后每4列打印一列(例如1、2、6、10等)。我还想删除第二行,因为这是一个包含不重要内容的标题。最后,我想根据第一列的值(作为字符串向量提供)过滤行 让我们举个例子,假设我只想要与“table”或“chair”匹配的行: string number1 junk1 junk2 junk3 number2 junk4 junk5 junk6 number3 junk7 junk8 junk9 junk10 junk11 j

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

如果您的栏目限制为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'BEGIN{OFS=“\t”}NR=2&&/table/| | | | | chair/| | NR==1{line=$1/s$2;(i=6;i如果您的列限制为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'BEGIN{OFS=“\t”}NR!=2和/table/| chair/| chair/| NR==1{line=$1 of s$2;对于(i=6;i
$awk-v keys='table | chair''NR==1 | |(NR>2和$1 ^(“keys”){out=$1;对于(i=2;i
$awk-v keys='table | chair''NR==1&$1){(i=2;iOkay,那么到目前为止您尝试了什么呢?我有一个工作解决方案,使用awk将数据传输到grep,速度非常慢,但不只是使用awk。我这里有另一个主题:但是有人问我一个新问题,要匹配的单词列表是以什么形式出现的?文件,还是shell数组,或者什么?我正在动态地从R调用awk代码到我们e data.table加载结果数据。因此,awk行是动态生成的。因此,它可以是动态生成的awk中的一个数组。如果1000个+| | |语句连接在一起是可能且可行的,下面的答案可能会起作用。如果您正在生成代码,那么您可以定义一个类似
a[“table”];a的数组[“主席”]
等。在
开始
块中,然后在a
中使用一个测试
$1。然而,如果你已经在使用R,那么我不知道你为什么要走这条路-使用R不是更有意义吗?好的,那么到目前为止你尝试了什么?我有一个使用awk的工作解决方案,它将管道连接到grep,速度非常慢,但不是只使用awk。我这里还有一个主题:但是有人问我一个新问题,要在什么形式的单词列表上构建匹配?文件、shell数组还是什么?我正在从R动态调用awk代码,以使用data.table加载结果数据。因此,awk行是动态生成的。因此,它可以是awk中的一个数组动态生成。如果将1000个+| |语句连接在一起是可能且可行的,那么下面的答案可能会起作用。如果您正在生成代码,则可以定义一个数组,如
a[“table”];a[“chair”]
等。在
开始
块中,然后在a
中使用一个测试
$1。但是,如果你已经在使用R,那么我不知道你为什么要走这条路线-使用R不是更有意义吗?不幸的是,数字列未知,可能是几百。第二个非常有效!是否也可以使v第一列应该与动态变量匹配的变量的向量?这样它就不必被知道或限制为两个?这与正在动态生成的命令一起工作:cmd=sprintf('awk-v filter=“%s”\'BEGIN{OFS=“\t”}NR==1 | |(NR!=2&(filter~$1)){line=$1 of s$2;对于(i=6;我想知道,当您只想选择以关键字
car
开头的行,而您的输入数据包含以
地毯
开头的行时。不幸的是,列数未知,可以是几百。第二个可以很好地工作!是否也可以使变量向量与第一列相同匹配一个动态变量?这样它就不必被知道或限制为两个?这与正在动态生成的命令一起工作:cmd=sprintf('awk-v filter=“%s”\'BEGIN{OFS=“\t”}NR==1 | |(NR!=2&&(filter~$1)){line=$1 of s$2;for(i=6;当您只想选择以关键字
car
开头的行,并且您的输入数据包含以
地毯
开头的行时,请尝试。