如何找到具有第n个长度的线

时间:2016-12-12 10:36:22

标签: linux bash awk sed apache-pig

示例文件:

this
is
a
sample
file
with
several
lines
of
varying
length

使用AWK查找计数为(单词长度的出现次数):

  1 1
  2 2
  3 4
  1 5
  2 6
  2 7

请建议如何找到包含第n个长度的行。

例如: - '是'如果第2行的长度为2,请建议如何找到长度相同的行。

8 个答案:

答案 0 :(得分:4)

获取具有特定长度的行的一种简单方法是使用egrep和正则表达式:

egrep -n '^.{2}$' your-sample-file.txt
2:is
9:of

在正则表达式中"^.{2}$" the "."(句点)表示任何字符,甚至是空格,"2"表示"."应重复的次数。 "^""$"代表一行的开头和结尾。 "-n"参数要求egrep检索行号。

答案 1 :(得分:1)

awk -v "len=2" 'length($0)==len{print}'

每个@dood建议

awk -v "len=2" 'length($0)==len'  

同样适用,基本上是一个grep长度非常整洁。

编辑,根据显示的数字列表重新解释问题,
没有特定顺序返回结果

awk '{a[length($0)]++}END{for(i in a)print i, a[i]}' bar
4 3
5 1
6 2
7 2
1 1
2 2

答案 2 :(得分:0)

我认为这就是你想要的。

  cat test.sh
    this
    is
    a
    sample
    file
    with
    several
    lines
    of
    varying
    length


awk -v "len=2" -F "\n" '{if ((length($0))==len) print "line " NR " length is " len}' test.sh
line 2 length is 2
line 9 length is 2

答案 3 :(得分:0)

$ perl -C -nle 'print "$. $_" if length == 2' < file
2 is
9 of

$ grep -n '^.\{2\}$' file
2:is
9:of

$ awk '/^.{2}$/ { print NR, $0}' file
2 is
9 of

使用GNU sed,您可以在输出中的不同行上打印行号:

$ sed -ne '/^.\{2\}$/ !d ; =; p' file
2
is
9
of

其中!d删除该行,如果它与模式不匹配,=会将带有尾随换行符的行号添加到模式空间中,p将打印当前模式空间。看起来没有内置选项可以不打印=的尾随换行符。

答案 4 :(得分:0)

假设发现只计算符合长度标准的行并且不返回每个可用计数的数组(如第二个数据样本):

awk -v "Length=4" -F '[[:alnum:]]' 'NF == ( Length + 1)' YourFile

# or in tinyline "optimized"
# 5 = 4 (len) + 1

awk -F '[^\001]' 'NF==5' YourFile

提示:

  • {print $0}是模式/条件匹配的默认操作,在本例中为NF == ( Length + 1)

答案 5 :(得分:0)

显示行

awk -v "Length=4" -F '[[:alnum:]]' 'NF == ( Length + 1) { print $0 }' YourFile

# or in tinyline "optimized"
# 5 = 4 (len) + 1

awk -F '[^\001]' 'NF==5' YourFile

计算行

awk -v "Length=4" -F '[[:alnum:]]' 'NF == ( Length + 1){Count++} END{ print Count}' YourFile

每个匹配行的详细信息

awk -v "Length=4" -F '[[:alnum:]]' 'NF == ( Length + 1){ print NR ":" $0}' YourFile

提示:

  • {print $0}是模式/条件匹配的默认操作,在本例中为NF == ( Length + 1)

(e)为此目的,grep是最快和最好的解决方案,尤其是在庞大的文件

答案 6 :(得分:0)

awk救援!

$ awk  ' {k=length($0); a[k]=a[k] FS $0} 
     END {for(k in a) print k ":" a[k]}' file | 
  sort -n

1: a
2: is of
4: this file with
5: lines
6: sample length
7: several varying

您可以轻松添加行号...

$ awk ' {k=length($0); a[k]=a[k] FS $0 "(" NR ")"} 
    END {for(k in a) print k":"  a[k]}' file | 
  sort -n

1: a(3)
2: is(2) of(9)
4: this(1) file(5) with(6)
5: lines(8)
6: sample(4) length(11)
7: several(7) varying(10)

答案 7 :(得分:0)

Apache Pig 。使用rank生成行号。通过比较行号和记录大小来过滤生成的关系。

A = LOAD 'sample.txt' as (line:chararray)
B = rank A;
C = FILTER B BY ($0 == SIZE(line))
DUMP C;