如何删除X字符前的所有单词

时间:2017-11-04 17:47:04

标签: linux bash awk

我正在使用此问题How To Delete All Words After X Characters中的代码,我在保留(不删除)30个字符后的所有字词时遇到问题。

原始代码:

awk 'BEGIN{FS=OFS="" }  length>30{i=30; while($i~/\w/) i++; NF=i-1; }1'

我的尝试:

awk 'BEGIN{FS=OFS="" }  length>30{i=30; while($i~/\w/) i++; NF=i+1; }1'

基本上,我理解我需要更改NF NF=i-1,因此我尝试将其更改为NF=i+1,但显然我只获得了一个字段。如何指定NF来打印其余部分?

示例数据:

StackOverflow Users Are Brilliant And Hard Working
#character 30 ---------------^

期望的输出:

And Hard Working

如果您能使用NF帮助我保留其余内容,我将非常感谢您的积极投入和支持。

6 个答案:

答案 0 :(得分:2)

使用gnu grep

会容易得多
grep -oP '^.{30}\w*\W*\K.*' file

And Hard Working

其中\K用于重置匹配的信息。

RegEx分手:

  • ^:开始
  • .{30}:匹配前30个字符
  • \w*:后跟0个或多个单词字符
  • \W*:后跟0个或更多非字字符
  • \K:到目前为止重置匹配的信息
  • .*:匹配此职位后的任何内容

使用awk您可以使用此解决方案:

awk '{sub(/^.{30}[_[:alnum:]]*[[:blank:]]*/, "")} 1' file

And Hard Working

最后一个sed解决方案:

sed -E 's/^.{30}[_[:alnum:]]*[[:blank:]]*//' file

And Hard Working

答案 1 :(得分:1)

另一个awk

awk '{print substr($0, index(substr($0,30),FS)+30)}'

在第30个字符之后找到分隔符索引,从该索引中获取子字符串。

答案 2 :(得分:1)

我无法想象你为什么考虑与NF有关的任何事情,因为你没有对字段做任何事情,你只是将每一行分成一个空白字符。听起来这就是两个问题所需要的,使用GNU awk for gensub():

queryInterface

或使用GNU sed更简洁:

$ awk '{print gensub(/(.{30}\S*)\s+(.*)/,"\\1",1)}' file
StackOverflow Users Are Brilliant

$ awk '{print gensub(/(.{30}\S*)\s+(.*)/,"\\2",1)}' file
And Hard Working

答案 3 :(得分:0)

请您试着跟随并告诉我这是否对您有帮助。

awk 'length($0)>30{val=substr($0,31);sub(/[^ ]*/,"",val);sub(/ /,"",val);print val}'  Input_file

答案 4 :(得分:0)

使用NF,你可以尝试

awk '{for(i=1;i<=NF;i++){a+=length($i)+1;if(a>30){for(j=i+1;j<=NF;j++)b=b $j" ";print b;exit}}}'

答案 5 :(得分:0)

cut -c30- file | cut -d' ' -f2-

这将只保留在第30个字符后开始的单词(index&gt; = 31)