我正在使用此问题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
帮助我保留其余内容,我将非常感谢您的积极投入和支持。
答案 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)