使用awk打印第一列、第二列和此后每3列打印一列,并仅打印符合条件的行
我试图让awk打印第一列、第二列和之后每4列打印一列(例如1、2、6、10等)。我还想删除第二行,因为这是一个包含不重要内容的标题。最后,我想根据第一列的值(作为字符串向量提供)过滤行 让我们举个例子,假设我只想要与“table”或“chair”匹配的行:使用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
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
开头的行,并且您的输入数据包含以地毯
开头的行时,请尝试。