Bash 使用命令行工具对行的子组进行排序
我一直在尝试用标准命令行工具bash、awk、sort等对其进行排序,但除了使用perl或类似工具外,找不到其他方法 有什么提示吗 输入数据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将标题作为每个数字行的前
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感谢你没有尝试?好吧,我在开玩笑)。该死,我就知道有人会为此给我一个“猫的无用用途奖”。该死,我就知道有人会因此给我一个“猫的无用用途奖”。