我有一个问题,我无法解决。 我有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,所以它们不是很大,但也不小。
感谢您的任何见解。
答案 0 :(得分:3)
使用此功能,您可以检查第二列是否以-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$/ {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
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
BEGIN{OFS=FS="\t"}
将标签设置为输出字段分隔符。$2~/-n$/ {}
匹配第二个字段以“-n”结尾的行,并在{}
内执行操作。size=split($2,a,"-")
根据-
分隔符将第二个字段分段切割并保存在a[]
数组中。将数组的大小存储在size
var。for (i=1; i<=size-2; i++) first=first"-"a[i]; second=a[size-1]"-"a[size]
将数据保存在两个不同的块中:首先是最后一个字段;然后,最后两个字段。print $1,first,second,$3
打印所有内容。first=second=""
取消设置变量。答案 1 :(得分:3)
试试这个单行:( gawk)
awk -F'\t' -v OFS='\t' '$2~/-n$/{$2=gensub(/-([^-]*-n$)/,"\t\\1","g",$2);print}' file
使用您的文件输出(f
):
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
答案 2 :(得分:1)
使用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