Bash 使用命令行工具对行的子组进行排序

Bash 使用命令行工具对行的子组进行排序,bash,command-line,Bash,Command Line,我一直在尝试用标准命令行工具bash、awk、sort等对其进行排序,但除了使用perl或类似工具外,找不到其他方法 有什么提示吗 输入数据 header1 3 2 5 1 header2 5 1 3 ..... ..... header1 1 2 3 5 header2 1 .... 输出数据 header1 3 2 5 1 header2 5 1 3 ..... ..... header1 1 2 3 5 header2 1 .... 谢谢请使用AWK将标题作为每个数字行的前

我一直在尝试用标准命令行工具bash、awk、sort等对其进行排序,但除了使用perl或类似工具外,找不到其他方法

有什么提示吗

输入数据

header1
3
2
5
1

header2
5
1
3
.....
.....
header1
1
2
3
5

header2
1
....
输出数据

header1
3
2
5
1

header2
5
1
3
.....
.....
header1
1
2
3
5

header2
1
....

谢谢

请使用AWK将
标题
作为每个数字行的前缀。
对结果文件进行排序。


删除前缀以将文件恢复为原始格式。

使用AWK将
标题
前缀添加到每个数字行。
对结果文件进行排序。

删除前缀以将文件恢复为原始格式。

尝试以下操作:

mark@ubuntu:~$ cat /tmp/test.txt
header1
3
2
5
1

header2
5
1
3
mark@ubuntu:~$ cat /tmp/test.txt | awk '/header/ {colname=$1; next} {print colname, "," , $0}'  | sort | awk '{if ($1 != header) {header = $1; print header} print $3}'
header1

1
2
3
5
header2
1
3
5
除掉空白行,我想你可以在结尾加上一个“GRIP-V'^ $”…< /P> < P>试试这个:

mark@ubuntu:~$ cat /tmp/test.txt
header1
3
2
5
1

header2
5
1
3
mark@ubuntu:~$ cat /tmp/test.txt | awk '/header/ {colname=$1; next} {print colname, "," , $0}'  | sort | awk '{if ($1 != header) {header = $1; print header} print $3}'
header1

1
2
3
5
header2
1
3
5

为了去掉空白行,我想你可以在结尾添加一个“yGRIP-V'^ $”…

假设部分用空行分隔,页眉不一定包含字符串“头”。使节保持原始顺序,以便排序稳定。从标准输入读取,在标准输出上显示

#!/bin/bash

function read_section() {
    while read LINE && [ "$LINE" ]; do echo "$LINE"; done
}

function sort_section() {
    read HEADER && (echo "$HEADER"; sort; echo)
}

while read_section | sort_section; do :; done
或作为一个班轮:

cat test.txt | while (while read LINE && [ "$LINE" ]; do echo "$LINE"; done) | (read HEADER && (echo "$HEADER"; sort; echo)); do :; done

假设各节由空行分隔,并且标题不一定包含字符串“header”。使节保持原始顺序,以便排序稳定。从标准输入读取,在标准输出上显示

#!/bin/bash

function read_section() {
    while read LINE && [ "$LINE" ]; do echo "$LINE"; done
}

function sort_section() {
    read HEADER && (echo "$HEADER"; sort; echo)
}

while read_section | sort_section; do :; done
或作为一个班轮:

cat test.txt | while (while read LINE && [ "$LINE" ]; do echo "$LINE"; done) | (read HEADER && (echo "$HEADER"; sort; echo)); do :; done

使用GNU awk,您可以使用其内部排序函数

awk 'BEGIN{ RS=""}
{
    print $1
    for(i=2;i<=NF;i++){
        a[i]=$i
    }
    b=asort(a,d)
    for(i=1;i<=b;i++){    
        print d[i]
    }
    delete d
    delete a    
} ' file

使用GNU awk,您可以使用其内部排序函数

awk 'BEGIN{ RS=""}
{
    print $1
    for(i=2;i<=NF;i++){
        a[i]=$i
    }
    b=asort(a,d)
    for(i=1;i<=b;i++){    
        print d[i]
    }
    delete d
    delete a    
} ' file

嗯,你能详细说明一下吗?请注意,这些标题不一定是有序的,排序应该是稳定的。@Arkaitz,
Mark
给出了我刚才所说的一个例子+我感谢他解决了这个问题(也许-1感谢你没有尝试?好吧,我在开玩笑)。嗯,你能详细说明一下吗?请注意,这些标题不一定是有序的,排序应该是稳定的。@Arkaitz,
Mark
给出了我刚才所说的一个例子+我感谢他解决了这个问题(也许-1感谢你没有尝试?好吧,我在开玩笑)。该死,我就知道有人会为此给我一个“猫的无用用途奖”。该死,我就知道有人会因此给我一个“猫的无用用途奖”。