查找文件中所有长度超过30个字符并将其分割的行的命令

时间:2018-12-12 09:37:46

标签: unix awk

我必须编写一个 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

6 个答案:

答案 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