示例文件:
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,请建议如何找到长度相同的行。
答案 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;