我感兴趣的是找出文件中最长行的行号。
例如,如果我有一个包含以下内容的文件:
lalala
tatatata
abracadabra
mu mu mu
我怎样才能编写一个 bash 脚本来给出如下输出:3 -> abracadabra
?
答案1
您可以使用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
答案2
您不需要脚本来执行此操作。一个简单的命令就足够了:
egrep -n "^.{$(wc -L < filename)}$" filename
即使有两条或多条具有相同最大长度的线,这也能起作用。
如果您希望输出完全符合以下形式:3 -> abracadabra
,则使用:
egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'
参考:
答案3
AO(N) 可以用 perl 单行代码实现:
perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'
usages(其中 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
答案4
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