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。