繁体   English   中英

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

[英]Bash - sort range of lines in file

嗨其他溢出用户。

我很想知道如何通过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行排序)

感谢您的关注 :)

使用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'将以批处理模式(带-s )放入ex并将命令2,5!sort应用于输入文件。 这将通过使用给定范围中的行执行外部sort实用程序,然后使用sort的输出替换相同的行来对第2行到第5行进行sort

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不支持相同类型的操作。

有头,GNU sed和tail:

(head -n 1 test.sh; sed -n '2,${/\\/p}' test.sh | sort; tail -n 1 test.sh) > test_new.sh

输出:

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

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

:.,+3 !sort

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

:.,/std/-1 !sort

编辑:从命令行:

ex -c'2,5 sort|w|q' test.sh
$ 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] :打印行1
  • lastline=a[NR] :保存变量lastline的最后一行
  • delete a[#] :删除数组中的第一行和最后一行
  • n=asort(a) :对数组中的剩余行进行排序,将数组项的数量(也就是数组中剩余的行数)分配给变量n
  • for/print :print lines 2 - next-to-last line
  • print lastline :打印最后一行

现在针对示例文件运行:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM