bash - 对文件中数据块内的行进行排序。根据列中的索引将一个块中的行移动到数据块中的不同位置
问题描述
我在一个文件中的数据排列如下。这仅显示了两个数据块/迭代。
21 ! <-- This is the number of lines of data in the data block/iteration. It never changes.
Linkages. Iteration:1_1010 ! <-- This number does not always increase by 5 like in this example, but always increases.
A 1.010 -3.582 -3.135
B 0.730 -4.428 -3.854
B -3.883 4.671 0.010
A -0.223 2.522 -4.893
B 2.769 4.634 0.179
B -2.024 -3.640 -1.032
A 4.613 3.914 1.567
B 2.746 -0.545 1.430
B -0.532 3.380 -2.107
C 3.944 2.513 -5.172
C -4.669 1.056 2.747
C 0.645 0.001 -3.737
C -2.875 -1.233 -0.538
C 4.279 -5.187 -2.820
C 1.067 -2.279 2.021
C 2.667 -1.558 0.588
C 3.628 -0.025 2.464
C -0.023 1.717 1.175
C 0.925 -1.548 2.273
C 1.152 2.914 1.039
C 0.878 -0.445 -0.948
21
Linkages. Iteration:1_1015
A 1.010 -3.582 -3.135
B 0.730 -4.428 -3.854
B -3.883 4.671 0.010
A -0.223 2.522 -4.893
B 2.769 4.634 0.179
B -2.024 -3.640 -1.032
A 4.613 3.914 1.567
B 2.746 -0.545 1.430
B -0.532 3.380 -2.107
C 3.944 2.513 -5.172
C -4.669 1.056 2.747
C 0.645 0.001 -3.737
C -2.875 -1.233 -0.538
C 4.279 -5.187 -2.820
C 1.067 -2.279 2.021
C 2.667 -1.558 0.588
C 3.628 -0.025 2.464
C -0.023 1.717 1.175
C 0.925 -1.548 2.273
C 1.152 2.914 1.039
C 0.878 -0.445 -0.948
我需要做的是重新分配“C”行。具体来说,我需要将“C”线分成四个块,然后将第一块 C 线移动到第一组“ABB”线下方。这是一个数据块/迭代的示例(我想对文件中的所有数据块/迭代做完全相同的事情):
21
Linkages. Iteration:1_1010
A 1.010 -3.582 -3.135
B 0.730 -4.428 -3.854
B -3.883 4.671 0.010
C 3.944 2.513 -5.172
C -4.669 1.056 2.747
C 0.645 0.001 -3.737
C -2.875 -1.233 -0.538
A -0.223 2.522 -4.893
B 2.769 4.634 0.179
B -2.024 -3.640 -1.032
C 4.279 -5.187 -2.820
C 1.067 -2.279 2.021
C 2.667 -1.558 0.588
C 3.628 -0.025 2.464
A 4.613 3.914 1.567
B 2.746 -0.545 1.430
B -0.532 3.380 -2.107
C -0.023 1.717 1.175
C 0.925 -1.548 2.273
C 1.152 2.914 1.039
C 0.878 -0.445 -0.948
我一直在尝试使用“排序”在 bash 中执行此操作,但没有取得太大进展。我发现按列索引(如我的第一列)排序的一般方法是这样做:
sort -n -k1 file
我还发现了这篇文章(https://unix.stackexchange.com/questions/99582/sorting -blocks-of-lines ),其中第二个答案使用“split”将文件拆分为由四行组成的块:
split -a 6 -l 4 input_file my_prefix_
但我不知道如何通过数据块/迭代移动四行。如果有人知道可以解释这一点的资源,那将是很好的发现。
解决方案
在每个 Unix 机器上的任何 shell 中使用任何 awk:
$ cat tst.awk
$1 ~ /^[ABC]$/ {
vals[++numVals] = $0
next
}
{
prtVals()
print
}
END { prtVals() }
function prtVals( row,valNr,blocks,numBlocks,blockNr,numCs) {
if ( numVals != 0 ) {
for (valNr=1; valNr<=numVals; valNr++) {
row = vals[valNr]
split(row,f)
if ( f[1] == "A" ) {
++numBlocks
}
if ( f[1] == "C" ) {
if ( (++numCs % 4) == 1 ) {
blockNr++
}
blocks[blockNr] = blocks[blockNr] row ORS
}
else {
blocks[numBlocks] = blocks[numBlocks] row ORS
}
}
for (blockNr=1; blockNr<=numBlocks; blockNr++) {
printf "%s", blocks[blockNr]
}
delete vals
numVals = 0
}
}
$ awk -f tst.awk file
21 ! <-- This is the number of lines of data in the data block/iteration. It never changes.
Linkages. Iteration:1_1010 ! <-- This number does not always increase by 5 like in this example, but always increases.
A 1.010 -3.582 -3.135
B 0.730 -4.428 -3.854
B -3.883 4.671 0.010
C 3.944 2.513 -5.172
C -4.669 1.056 2.747
C 0.645 0.001 -3.737
C -2.875 -1.233 -0.538
A -0.223 2.522 -4.893
B 2.769 4.634 0.179
B -2.024 -3.640 -1.032
C 4.279 -5.187 -2.820
C 1.067 -2.279 2.021
C 2.667 -1.558 0.588
C 3.628 -0.025 2.464
A 4.613 3.914 1.567
B 2.746 -0.545 1.430
B -0.532 3.380 -2.107
C -0.023 1.717 1.175
C 0.925 -1.548 2.273
C 1.152 2.914 1.039
C 0.878 -0.445 -0.948
21
Linkages. Iteration:1_1015
A 1.010 -3.582 -3.135
B 0.730 -4.428 -3.854
B -3.883 4.671 0.010
C 3.944 2.513 -5.172
C -4.669 1.056 2.747
C 0.645 0.001 -3.737
C -2.875 -1.233 -0.538
A 1.010 -3.582 -3.135
B 0.730 -4.428 -3.854
B -3.883 4.671 0.010
C 3.944 2.513 -5.172
C -4.669 1.056 2.747
C 0.645 0.001 -3.737
C -2.875 -1.233 -0.538
A -0.223 2.522 -4.893
B 2.769 4.634 0.179
B -2.024 -3.640 -1.032
C 4.279 -5.187 -2.820
C 1.067 -2.279 2.021
C 2.667 -1.558 0.588
C 3.628 -0.025 2.464
A -0.223 2.522 -4.893
B 2.769 4.634 0.179
B -2.024 -3.640 -1.032
C 4.279 -5.187 -2.820
C 1.067 -2.279 2.021
C 2.667 -1.558 0.588
C 3.628 -0.025 2.464
A 4.613 3.914 1.567
B 2.746 -0.545 1.430
B -0.532 3.380 -2.107
C -0.023 1.717 1.175
C 0.925 -1.548 2.273
C 1.152 2.914 1.039
C 0.878 -0.445 -0.948
A 4.613 3.914 1.567
B 2.746 -0.545 1.430
B -0.532 3.380 -2.107
C -0.023 1.717 1.175
C 0.925 -1.548 2.273
C 1.152 2.914 1.039
C 0.878 -0.445 -0.948
推荐阅读
- java - 数据库条目的日期字段到期时触发事件
- python - 将 dict1 的值插入 dict2 但在 dict2 的特定位置
- filter - wireshark:使用过滤器将数据从转储转换为文本文件
- android - 使用 gradle 错误构建 Android 项目失败:“非法嵌入符号字符”
- yocto - 将 python 内部模块(cgi.py)添加到 yocto 图像
- c# - 如果存在则删除子字符串
- java - 哪个 jar 有 ACWrapper 类
- bash - 如何对选项卡文件中的每一列进行累积和连续求和(UNIX 环境)
- sql - 要在 informatica 源限定符转换中使用的递归 DB2 Sql 查询
- arduino - Arduino:如何逐行读取 SD 卡文本文件