[英]awk/grep certain parts of a specific column
我有一個問題,我無法解決。 我有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$/ {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
存儲在size
var中。 for (i=1; i<=size-2; i++) first=first"-"a[i]; second=a[size-1]"-"a[size]
for (i=1; i<=size-2; i++) first=first"-"a[i]; second=a[size-1]"-"a[size]
將數據保存在兩個不同的塊中:首先是所有內容,直到倒數第二個字段; 然后,最后兩個字段。 print $1,first,second,$3
打印所有內容。 first=second=""
取消設置變量。 試試這個單線:( 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
使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.