Text-Processing
如何從塊中對具有特定行的行塊進行排序?
我有一個包含這樣數據的文件
BEGIN hello2 5 world1 END BEGIN hello4 2 world5 END BEGIN hello6 4 END
我想根據塊內的數字按以下方式對行進行排序。這些數字是孤立的和唯一的。
BEGIN hello4 2 world5 END BEGIN hello6 4 END BEGIN hello2 5 world1 END
我知道如何用 sed 和 awk 列印塊。就是這樣。
# Prints the blocks including the BEGIN and END tags cat file | sed -n '/^BEGIN$/,/^END$/p' # Prints the blocks exluding the BEGIN and END tags awk '/^BEGIN$/ {show=1;next} /^END$/{show=0} { print }' file
每次
BEGIN
遇到一行時,使用單獨的句柄 via 分別從文件中讀取下一個數字行getline
。使用兩個前綴列印文件中的每一行,即先前檢索到的數值和目前記錄的文件記錄編號(因此,同BEGIN .. END
一塊中的所有行最終在前綴 1 中具有相同的值,對應於嵌入在堵塞)。將此提供給外部sort
和cut
實用程序,以通過丟棄前綴來處理基於前綴的排序。awk '/BEGIN/{"awk \\$0+0==\\$0 "FILENAME | getline x} {print x"~"FNR"~"$0 | "sort -k1,1n -k2,2n -t~ | cut -f3- -d~"}' file BEGIN hello4 2 world5 END BEGIN hello6 4 END BEGIN hello2 5 world1 END
使用 GNU awk:
gawk ' BEGIN { RS="\nEND\n"; ORS = RS; FS = "\n" } { record[$3] = $0 } END { PROCINFO["sorted_in"] = "@ind_num_asc" for (val in record) print record[val] } ' file
根據您的數據,我假設 BEGIN 和數字之間總是有一行。
該
PROCINFO
行定義瞭如何遍歷“記錄”數組。見https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html