如何对n行后的文件内容进行排序?

如何对n行后的文件内容进行排序?

在Linux中,我们可以运行sort命令来对文件内容进行排序,但在我的例子中,我有以下文件(THANKS.txt):

These people have contributed to OSN Envoy. We always try to keep this list updated and correct. 
If you notice that your name is not listed here, then feel free to contact us.

Ar Rakin
Peter Williamson
David Brook
Bill Natt

该文件包含软件项目的贡献者列表。

我只想使用命令按字母顺序对名称进行排序sort,有什么想法吗?

答案1

awk

awk '
  NR == 1, NF == 0 {
    # print and skip all lines until the first blank
    # one (one where the Number of Fields is 0)
    print; next
  } 

  {print | "sort"} # pass the rest to sort
  ' < file

替换NF == 0NR == 3在第三行而不是在第一个空白行处停止。

为了避免其余部分都经过awkand sort(也避免运行额外的 shell 来awk解释这个简单的sort命令行),您可以这样做:

{
  sed '/[^[:blank:]]/!q'
  sort
} < file

其中sed quits 找到第一行不!包含非空白字符 ( ) 。将第三行更改为sed 3quit 。q

如果输入不可查找(例如当它来自管道时),sed则无法将光标保留在该行分隔符之后的文件中,这意味着sort将错过可能已读取的额外数据sed(如它以较大的块读取输入)。

通过 GNU 实现sed,您可以添加-u选项,使其一次读取一个字节的输入,以免读取太多。

答案2

这将为您提供已排序的姓名列表:

sed '1,/^$/d' <THANKS.txt | sort

管道用于sed删除从第一行到第一个空行的所有内容,并将其余部分传递给sort排序。您还可以使用空行的行号来代替正则表达式地址/^$/,无论是在上面还是在这个答案的其他命令中,如果这更容易的话。

该文件的初始部分可以通过

sed '1,/^$/!d' <THANKS.txt

d该命令实质上反转了该命令的条件,sed以便删除名称列表而不是提取名称列表。

这两个命令一起可以用来解决总体问题,创建THANKS-sorted.txt输出文件:

{ sed '1,/^$/!d' <THANKS.txt; sed '1,/^$/d' <THANKS.txt | sort; } >THANKS-sorted.txt

或者,使用更好的格式:

{
    sed '1,/^$/!d' <THANKS.txt
    sed '1,/^$/ d' <THANKS.txt | sort
} >THANKS-sorted.txt

ed编辑:

printf '%s\n' '1,/^$/ p' '+,$ w !sort' 'q' | ed -s THANKS.txt >THANKS-sorted.txt

这使用ed如下所示的编辑脚本:

1,/^$/ p
+,$ w !sort
q

此编辑脚本输出前几行,直到第一个空行。然后,它将从空行之后的下一行到文档末尾的所有行写入sort,从而输出排序后的名称。

最终q退出编辑器,最后的重定向将结果文本写入THANKS-sorted.txt.

答案3

如果head命令没有关闭stdin(Linux 上没有),请尝试

{ head -n2; sort; } < file
These people have contributed to OSN Envoy. We always try to keep this list updated and correct. 
If you notice that your name is not listed here, then feel free to contact us.

Ar Rakin
Bill Natt
David Brook
Peter Williamson

如果 stdin 被关闭head,请尝试类似的操作

{ read TMP; echo "$TMP"; read TMP; echo "$TMP"; sort; } < file
These people have contributed to OSN Envoy. We always try to keep this list updated and correct.
If you notice that your name is not listed here, then feel free to contact us.

Ar Rakin
Bill Natt
David Brook
Peter Williamson

相关内容