在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 == 0
为NR == 3
在第三行而不是在第一个空白行处停止。
为了避免其余部分都经过awk
and sort
(也避免运行额外的 shell 来awk
解释这个简单的sort
命令行),您可以这样做:
{
sed '/[^[:blank:]]/!q'
sort
} < file
其中sed
q
uits 找到第一行不!
包含非空白字符 ( ) 。将第三行更改为sed 3q
uit 。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