繁体   English   中英

awk / sed正则表达式,提取包含定界符的列

[英]awk/sed regex, extract a column that has the delimiter

我有一个具有这种格式的文件:这是名称的开头两列数字,末尾两列数字中间是一列,但名称有一个空格分隔符,将事情弄乱了。

有什么我可以正确取出名称列的正则表达式。 无论如何,我可以使用sed替换(或删除)该列中的空间,以便我可以轻松地将该列取出来吗?

例:

 1 2 name 3 4
 12 12 name1 name2 3 4
 12 12 name1 name2 name3 name4 3 4 
 3 4 name 3 4 

-我想要的输出是:

name 
name1_name2
name1_name2_name3_name4
name

谢谢,

阿米尔,

使用awk的一种解决方案是:

cat foo | awk '{ for(i=3; i<=NF-3; i++) { printf $i "_"; } printf $i "\n";  }'

这是使用sed的同一件事:

cat foo  | sed -e 's/^[0-9 ]*//g' -e 's/ [0-9 ]*$//g' -e 's/ /_/g'

符合POSIX要求,以确保清晰:

cat foo  | sed -e 's/^[[:digit:][:space:]]*//g' -e 's/[[:space:]]*[[:digit:][:space:]]*$//g' -e 's/ /_/g'
sed 's/^[0-9]\+ [0-9]\+ \(.*\) [0-9]\+ [0-9]\+$/\1/;s/ /_/g'

没有循环的另一种awk方式

 awk 'BEGIN{OFS="_"}{$1=$2=$NF=$(NF-1)="";gsub(/__/,"")}1' yourFile

测试

kent$  cat t
 1 2 name 3 4
 12 12 name1 name2 3 4
 12 12 name1 name2 name3 name4 3 4 
 3 4 name 3 4 

kent$  awk 'BEGIN{OFS="_"}{$1=$2=$NF=$(NF-1)="";gsub(/__/,"")}1' t
name
name1_name2
name1_name2_name3_name4
name

几个Perl选项

perl -lne  '/\d+ \d+ (.+) \d+ \d+/ and do {($_ = $1) =~ s/ /_/g; print}'
perl -lape  'for (1..2) {shift @F; pop @F}; $_ = join "_", @F'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM