awk/grep特定列的某些部分

awk/grep特定列的某些部分,awk,grep,Awk,Grep,我有一个问题不知道该怎么解决。 我有3列选项卡分隔的数据,例如: abs nmod+n+n-commitment-n 349.200023 abs nmod+n+n-a-commitment-n 333.306429 abs into+ns-j+vn-pass-rb-divide-v 295.57316 abs nmod+n+ns-commitment-n 182.085018 abs nmod+n+n-pledge-n 149.927391 abs nmod+n+ns-reage

我有一个问题不知道该怎么解决。 我有3列选项卡分隔的数据,例如:

abs nmod+n+n-commitment-n   349.200023
abs nmod+n+n-a-commitment-n 333.306429
abs into+ns-j+vn-pass-rb-divide-v   295.57316
abs nmod+n+ns-commitment-n  182.085018
abs nmod+n+n-pledge-n   149.927391
abs nmod+n+ns-reagent-n 142.347358
我需要分离第三列的最后两个“元素”,其中我想要的结果是一个4列输出,其中只包含以“-n”结尾的元素

例如:

abs nmod+n+n   commitment-n   349.200023
abs nmod+n+n-a   commitment-n 333.306429
abs nmod+n+ns   commitment-n  182.085018
abs nmod+n+n   pledge-n   149.927391
abs nmod+n+ns   reagent-n 142.347358
在这种情况下,是否有
awk
grep
可以提供帮助的信息?这些文件大约为500 MB,因此它们不是很大,但也不是很小。
感谢您的帮助。

有了这些,您可以检查第二列是否以
-n
结尾,然后打印以下行:

$ awk '$2~/-n$/' file
abs nmod+n+n-commitment-n   349.200023
abs nmod+n+n-a-commitment-n 333.306429
abs nmod+n+ns-commitment-n  182.085018
abs nmod+n+n-pledge-n   149.927391
abs nmod+n+ns-reagent-n 142.347358
要拆分第二个字段,以便隔离最后两个元素,可以使用:

awk 'BEGIN{OFS=FS="\t"}
     $2~/-n$/ {
               size=split($2,a,"-");
               for (i=1; i<=size-2; i++) first=first"-"a[i];
               second=a[size-1]"-"a[size];
               print $1,first,second,$3;
               first=second=""
              }' file
awk'BEGIN{OFS=FS=“\t”}
$2~/-n$/{
大小=拆分($2,a,“-”);

对于(i=1;i试试这一行:(呆呆地)

与文件一起输出(如
f
):


使用
sed

sed -r -n '/-n\t[0-9.]*$/{s/(\S+)\t(.*)-([^-]+-\S+)\t(.*)/\1\t\2\t\3\t\4/p}' filename
对于您的输入,它将产生:

abs nmod+n+n    commitment-n    349.200023
abs nmod+n+n-a  commitment-n    333.306429
abs nmod+n+ns   commitment-n    182.085018
abs nmod+n+n    pledge-n    149.927391
abs nmod+n+ns   reagent-n   142.347358

+1,你的更好,似乎无法避免使用split(),我很懒…(删除了我的。但是在你的输出中第二列有前导的
-
s。请修复它。最终找到了一种不拆分的方法。:)我知道你会找到一种方法!!;)
kent$  awk -F'\t' -v OFS='\t' '$2~/-n$/{$2=gensub(/-([^-]*-n$)/,"\t\\1","g",$2);print}' f
abs     nmod+n+n        commitment-n    349.200023
abs     nmod+n+n-a      commitment-n    333.306429
abs     nmod+n+ns       commitment-n    182.085018
abs     nmod+n+n        pledge-n        149.927391
abs     nmod+n+ns       reagent-n       142.347358
sed -r -n '/-n\t[0-9.]*$/{s/(\S+)\t(.*)-([^-]+-\S+)\t(.*)/\1\t\2\t\3\t\4/p}' filename
abs nmod+n+n    commitment-n    349.200023
abs nmod+n+n-a  commitment-n    333.306429
abs nmod+n+ns   commitment-n    182.085018
abs nmod+n+n    pledge-n    149.927391
abs nmod+n+ns   reagent-n   142.347358