我有以下数据文件
10
AA 21.1218 14.7862 0.0566269
BB 26.5036 14.5513 19.975
CC 7.82448 1.30605 50.126899
AA 10.0179 4.3786 21.232036
BB 4.80236 4.23255 36.217038
CC 31.475 9.60365 7.237505
AA 8.39392 5.89571 10.30242
......
10
AA 21.1218 14.7862 0.0566269
BB 26.5036 14.5513 19.975
CC 7.82448 1.30605 50.126899
AA 10.0179 4.3786 21.232036
BB 4.80236 4.23255 36.217038
CC 31.475 9.60365 7.237505
AA 8.39392 5.89571 10.30242
......
每个数据块由12行组成,重复100次(文件总数为1200)我从这里学到了我可以在数据块内部排序,但是如何处理每个数据集的前两行?它们是标题行,因此需要保留。
所以,我希望有像
这样的文件10
AA 21.1218 14.7862 0.0566269
AA 10.0179 4.3786 21.232036
AA 8.39392 5.89571 10.30242
BB 26.5036 14.5513 19.975
BB 4.80236 4.23255 36.217038
CC 7.82448 1.30605 50.126899
CC 31.475 9.60365 7.237505
......
10
AA 21.1218 14.7862 0.0566269
AA 10.0179 4.3786 21.232036
AA 8.39392 5.89571 10.30242
BB 26.5036 14.5513 19.975
BB 4.80236 4.23255 36.217038
CC 7.82448 1.30605 50.126899
CC 31.475 9.60365 7.237505
......
我在尝试
awk '{print int((NR-1)/12), $0}' file.txt | sort -nk1 > result
但这对我没有用。另外,如何在按第一列排序时处理前两个标题行?
谢谢
最佳,
答案 0 :(得分:1)
我认为您希望基于第一个字段进行稳定排序。这个脚本可以。您需要用空行结束数据文件,否则代码需要END块来打印最后一个内容块。
NF > 1 { # contents section
a[$1, NR] = $0 # collect by key+line number (for stable sorting)
}
NF == 1 { # header line, just print and move
print $0
}
NF == 0 { # end of contents marker
n = asorti(a, b) # sort the index values into array b
for (i = 1; i <= n; i++) {
print a[b[i]] # print based on sorted indices
}
print $0 # print empty line
}
答案 1 :(得分:1)
您没有准确指定您的排序条件,但看起来您想要这样(我从输入中删除了无用的,混淆的,复杂的....
行:
$ cat tst.awk
BEGIN { OFS="\t" }
NF==1 { idx=1; cnt++ }
NF==0 { idx=2 }
NF>1 { idx=3 }
{ print cnt, idx, $1, NR, $0 }
$ awk -f tst.awk file | sort -k1n -k2n -k3 -k4n | cut -f5-
10
AA 21.1218 14.7862 0.0566269
AA 10.0179 4.3786 21.232036
AA 8.39392 5.89571 10.30242
BB 26.5036 14.5513 19.975
BB 4.80236 4.23255 36.217038
CC 7.82448 1.30605 50.126899
CC 31.475 9.60365 7.237505
10
AA 21.1218 14.7862 0.0566269
AA 10.0179 4.3786 21.232036
AA 8.39392 5.89571 10.30242
BB 26.5036 14.5513 19.975
BB 4.80236 4.23255 36.217038
CC 7.82448 1.30605 50.126899
CC 31.475 9.60365 7.237505