Answers:
您不需要执行此操作的脚本。一个简单的命令就足够了:
egrep -n "^.{$(wc -L < filename)}$" filename
即使您有两条或更多行具有相同的最大长度,这也将起作用。
如果您希望输出完全采用以下形式:3 -> abracadabra
,则使用:
egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'
参考文献:
-C 3
可以在grep选项中添加(例如)以获取上下文前后的几行内容
您可以awk
用来打印每行(length()
)和行号(NR
)的长度,然后按数字()反转(-r
)sort
结果-n
:
$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt
10 3 abracadabr
8 4 mu mu mu
7 2 tatatat
6 1 lalala
仅显示第一行:
$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt | head -n 1
10 3 abracadabr
wc -L
,我不知道该说法。确实非常有用。
可以使用perl一种衬垫实现AO(N):
perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'
用法(其中machin是文件名)
cat machin | perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'
要么
perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max' machin
或(不太清楚但较短)
perl -ne 'if(length>length$m){$m=$_};END{print$m}' machin
Radu的答案是完全足够的并且是首选的,尽管如果您想要更显式且基于Shell的解决方案,则可以使用以下脚本:
#!/bin/bash
longest_length=0
longest_string=0
while IFS= read -r line || [ -n "${line}"]
do
if [ "${#line}" -gt "${longest_length}" ]
then
longest_length="${#line}"
longest_string="$line"
fi
done < "$1"
echo "${longest_string}"
用法: ./find_longest.sh input.txt
例:
$ cat input.txt
1 2
2 3 a a a a
4 5 6
1 1 1 5
$ ./find_longest.sh input.txt
2 3 a a a a
^
)的开始和行尾($
)之间的任何一行,正好具有n个字符(.{n}
)。然后,他只需要找到n:为此,他使用GNU主义的“ wc -L filename”(注意这不是posix),它返回文件名最长的行的长度。因此,他会抓紧任何最长的线。$(cmd)
由的输出替换cmd
。