我必须编写一个 awk 命令,该命令将找到指定文件中所有长度超过30个字符的所有行,并将这些行拆分为多行,每行不超过30个字符。>
我知道我可以使用
找到长度awk 'length>30' test.txt
但是如何对文件进行后处理并拆分每一行?
例如如果我的文件是这样的:-
qwertyuiopadfgghjkklkllllllvvvxxxx
jjjjfff
aaahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
ggggggggggggg
dddddddddddddd
gggggggggggggggggggg
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
运行命令后,应该是这样的(没有一行包含超过30个字符):-
qwertyuiopadfgghjkklkllllllvv
vxxxx
jjjjfff
aaahhhhhhhhhhhhhhhhhhhhhhhhhh
hhhhhhhhhhhhhhhhhhh
ggggggggggggg
dddddddddddddd
gggggggggggggggggggg
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaa
答案 0 :(得分:2)
很简单,有一个实用程序fold
:
fold -w 30 text.txt
在每个FILE中包裹输入行(默认为标准输入),写入 标准输出。
如果您需要坚持使用gawk
这个解决方案,作为一种好奇心,该解决方案很固定但很容易,您就可以了解FIELDWITHS
的工作原理:
gawk 'BEGIN { FIELDWIDTHS = "30 30 30 30 30 30"}{for (i=1;i<=NF;i++){if ($i!=""){print $i}}}' text.txt
答案 1 :(得分:0)
您可以为此执行以下操作:
awk '(length>30) { for(i=1;i<=length;i+=30) print substr($0,i,30)}' file
如果您还想要其他行,则可以执行以下操作:
awk '(length>30) { for(i=1,i<=length;i+=30) print substr($0,i,30); next} 1' file
在这里,我们只打印感兴趣的子字符串。这些子字符串的长度始终为30,并从索引1,31,61,91,...开始。
如果您不喜欢一直重新计算长度的概念,则可以执行以下操作:
awk '{L=length} (L>30){ for(i=1;i<=L;i+=30) print substr($0,i,30)}' file
awk '{L=length} (L>30){ for(i=1;i<=L;i+=30) print substr($0,i,30); next}1' file
length[([s])]
:如果没有参数,则返回以字符串为单位的参数长度或整个记录$0
的长度(以字符为单位)。 / p>
substr(s, m[, n ])
:返回从位置n
开始的s
的最多m
个字符的子字符串,从{{1}开始编号}。如果省略1
,或者如果n
指定的字符多于字符串中剩余的字符,则子字符串的长度应受字符串n
的长度的限制。
答案 2 :(得分:0)
请您尝试以下。
awk '
{
val=""
count=1
while($0){
val=(val?val ORS:"")substr($0,1,30)
count+=30
$0=substr($0,count)
}
print val
}' Input_file
输出如下。
qwertyuiopadfgghjkklkllllllvvv
xxxx
jjjjfff
aaahhhhhhhhhhhhhhhhhhhhhhhhhhh
hhhhhhhhhhhhhhhhhh
ggggggggggggg
dddddddddddddd
gggggggggggggggggggg
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaa
答案 3 :(得分:0)
如何处理gsub
:
$ awk '{gsub(/.{30}/,"&" ORS)}1' file
该样本的输出:
qwertyuiopadfgghjkklkllllllvvv
xxxx
jjjjfff
aaahhhhhhhhhhhhhhhhhhhhhhhhhhh
hhhhhhhhhhhhhhhhhh
ggggggggggggg
dddddddddddddd
gggggggggggggggggggg
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaa
自然,如果您的RS
不是\n
,则需要处理,例如RS="\r?\n"
。
答案 4 :(得分:0)
Perl解决方案:
> cat lokesh.txt
qwertyuiopadfgghjkklkllllllvvvxxxx
jjjjfff
aaahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
ggggggggggggg
dddddddddddddd
gggggggggggggggggggg
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
> perl -pe ' s/(.{30})/\1\n/g; ' lokesh.txt
qwertyuiopadfgghjkklkllllllvvv
xxxx
jjjjfff
aaahhhhhhhhhhhhhhhhhhhhhhhhhhh
hhhhhhhhhhhhhhhhhh
ggggggggggggg
dddddddddddddd
gggggggggggggggggggg
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaa
>
答案 5 :(得分:-1)
我认为这段代码可以工作,但是很遗憾,我无法对其进行测试:
awk -F, 'length($0) > 30' /path/to/input > good_field_length.txt