如何从文件中获取最长的行?

use*_*965 13 command-line bash scripts

我有兴趣从文件中找出最长行的行号。

例如,如果我有一个包含以下内容的文件:

lalala
tatatata
abracadabra
mu mu mu
Run Code Online (Sandbox Code Playgroud)

我怎样才能编写一个 bash 脚本,它会给我这样的输出:3 -> abracadabra

Rad*_*anu 11

您不需要脚本来执行此操作。一个简单的命令就足够了:

egrep -n "^.{$(wc -L < filename)}$" filename
Run Code Online (Sandbox Code Playgroud)

即使您有两条或多条具有相同最大长度的行,这也将起作用。

如果您希望输出完全采用这种形式: 3 -> abracadabra,请使用:

egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'
Run Code Online (Sandbox Code Playgroud)

参考:

  • @don.joey:这就是 unix 的力量。简单的命令,可以一起工作。在这里,他查找“^.{n}$”,即在行首(`^`)和行尾(`$`)之间正好有n 个字符(`.{n}`)的任何行。然后他只需要找到 n:为此他使用 GNU 主义,“wc -L 文件名”(注意这不是 posix),它返回文件名最长行的长度。所以他会搜索任何长度最长的行。`$(cmd)` 被替换为 `cmd` 的输出。 (3认同)

Att*_* O. 10

您可以使用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
Run Code Online (Sandbox Code Playgroud)

只显示第一行:

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt | head -n 1
10 3 abracadabr
Run Code Online (Sandbox Code Playgroud)