Bash - 对文件中的行进行排序

时间:2017-09-02 20:35:39

标签: linux bash sorting range lines

嗨其他溢出用户。

我很想知道如何通过Linux中的终端命令对文件中的一系列行进行排序。

例如在test.sh文件中:

g++ -o test.out \
Main.cpp \
Framework.cpp \
Sample.cpp \
Blub.cpp \
-std=c++14 -lboost

如何从此文件中的第二行到第二行(源文件名)进行排序。

期望的输出:

g++ -o test.out \
Blub.cpp \
Framework.cpp \
Main.cpp \
Sample.cpp \
-std=c++14 -lboost

(从第2 - 5行排序)

感谢您的关注:)

4 个答案:

答案 0 :(得分:6)

使用ex行编辑器进行排序:

$ cat file
g++ -o test.out \
Sample.cpp \
Main.cpp \
Framework.cpp \
Blub.cpp \
-std=c++14 -lboost

$ echo 'x' | ex -s -c '2,5!sort' file

$ cat file
g++ -o test.out \
Blub.cpp \
Framework.cpp \
Main.cpp \
Sample.cpp \
-std=c++14 -lboost

ex -s -c '2,5!sort'ex置于批处理模式(使用-s)并将命令2,5!sort应用于输入文件。这将通过使用给定范围内的行执行外部sort实用程序,然后使用sort的输出替换相同的行来对第2行到第5行进行排序。

echo 'x'用于将x命令发送到ex,这将使其保存修改后的缓冲区并退出。如果没有这个,您必须在终端上手动输入x,然后按 Enter 退出ex

这假定为经典ex(在BSD中找到)。如果您从Vim发行版获得ex,则可以使用

$ ex -s -c '2,5 sort|x' file

这使用Vim ex中的内部排序命令(与Vim中的:sort相同)。

根据评论中的要求:

使用BSD ex对文件中第2行到第二行到最后一行的所有行进行排序:

$ echo 'x' | ex -s -c '2,$-1!sort' file

或者,与Vim的ex

$ ex -s -c '2,$-1 sort|x' file

范围从2,5更改为2,$-1,即从第2行更改为“结尾减1”。

遗憾的是sed不支持相同类型的操作。

答案 1 :(得分:3)

用头,GNU sed和tail:

Traceback (most recent call last):
File "...\test.py", line 45, in <module>
   entry_box.send_keys(i)
File "...\Python36\lib\site-packages\selenium\webdriver\remote\webelement.py", line 349, in send_keys
   {'text': "".join(keys_to_typing(value)),
File "...\Python36\lib\site-packages\selenium\webdriver\common\utils.py", line 150, in keys_to_typing
   for i in range(len(val)):
TypeError: object of type 'numpy.int64' has no len()

输出:

g++ -o test.out \
Blub.cpp \
Framework.cpp \
Main.cpp \
Sample.cpp \
-std=c++14 -lboost

答案 2 :(得分:1)

当您在vi中修改文件,并且光标位于Blub.cpp时,您可以输入

:.,+3 !sort

或者当您不想计算行数时,请使用另一个范围:

:.,/std/-1 !sort

编辑: 从命令行:

ex -c'2,5 sort|w|q' test.sh

答案 3 :(得分:0)

$ cat test.awk
{ a[NR]=$0 }
END { 
    print a[1]
    lastline=a[NR]
    delete a[1]
    delete a[NR]
    n=asort(a)
    for (i = 1; i <= n; i++) { print a[i] }
    print lastline
}
  • a[NR]=$0:将文件的行加载到数组a;使用行/记录号(NR)作为数组索引
  • END { ... }:一旦我们将所有行加载到数组中,请对阵列应用以下命令...
  • print a[1]:print line 1
  • lastline=a[NR]:保存变量lastline
  • 中的最后一行
  • delete a[#]:删除第一个&amp;数组的最后几行
  • n=asort(a):对数组中的其余行进行排序,将数组项的数量(也就是数组中剩余的行数)分配给变量n
  • for/print:打印第2行 - 倒数第二行
  • print lastline:打印最后一行

现在针对示例文件运行:

$ awk -f test.awk test.sh
g++ -o test.out \
Blub.cpp \
Framework.cpp \
Main.cpp \
Sample.cpp \
-std=c++14 -lboost