linux—如何找到第n个长度的行

hgb9j2n6  于 2021-06-21  发布在  Pig
关注(0)|答案(8)|浏览(350)

示例文件:

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个长度的线。
例如:-“is”在第2行有长度2,请建议如何找到长度相同的行。

ifmq2ha2

ifmq2ha21#

获取具有特定长度的行的一种简单方法是将egrep与regex一起使用:

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

在正则表达式中 "^.{2}$" the "." (句点)表示任何字符,偶数空格,以及 "2" 表示多少次 "." 应该重复。 "^" 以及 "$" 表示一行的开始和结束。这个 "-n" 参数要求egrep检索行号。

bjg7j2ky

bjg7j2ky2#

假设查找只是对符合长度标准的行进行计数,而不返回每个可用计数的数组(如第二个数据示例):

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)

n1bvdmb6

n1bvdmb63#

$ 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 打印当前图案空间。似乎没有内置选项可以不打印的尾随换行符 = .

3bygqnnd

3bygqnnd4#

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)
x4shl7ld

x4shl7ld5#

ApachePig。使用rank生成行号。通过比较行号和记录大小来筛选结果关系。

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

kyxcudwk6#

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
zf9nrax1

zf9nrax17#

我想这就是你想要的。

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
s2j5cfk0

s2j5cfk08#

显示行

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是最快、最好的解决方案,尤其是在大文件上

相关问题