【发布时间】:2018-08-28 17:34:09
【问题描述】:
我有散布在 100 个文件中的数据块,这些文件在重新排序时会按照数字顺序排列。例如,如果我有 100 个数据块,那么块 #1、3、5 可能在一个文件中,而块 #2、4、6 可能在另一个文件中。我需要按顺序创建 1 个包含所有块的输出文件:#1,2,3,4,5,6。
以下是 2 个(共 100 个)输入文件的简化版本。每个块都以“ITEM: TIMESTEP”开头,并且需要按以下行中的数字进行组织(这里是 1000、2000、3000、4000)。
输入文件 1
项目:TIMETEP
1000
项目:原子数
50 2 H 0.4 0.3 0.006
10214 2 H 0.5 0.4 0.002
......#12,000 行之后#...
ITEM: TIMETEP
3000
项目:原子数
50 2 H 2.3 1.4 0.3
10214 2 H 2.5 1.3 0.6
......#12,000 行之后#...
输入文件 2
项目:TIMETEP
2000
项目:原子数
50 2 H 0.4 0.3 0.006
10214 2 H 0.5 0.4 0.002
......#12,000 行之后#...
ITEM: TIMETEP
4000
项目:原子数
50 2 H 2.3 1.4 0.3
10214 2 H 2.5 1.3 0.6
......#12,000 行之后#...
最终的输出文件如下所示
项目:TIMETEP
1000
....#其余部分#...
项目:TIMETEP
2000
....#其余部分#...
项目:TIMETEP
3000
....#其余部分#...
项目:TIMETEP
4000
....#rest of chunk#...
到目前为止,我已经在每个块的开头插入了一个名为“IDENTIFIER”的标识符字符串:
awk -v n=12,000 '1; NR%n==0 {print "IDENTIFIER"}' in.txt >> out1.txt
我可以打印每个标识符字符串后面的每个块所需的 N 行,循环遍历多个文件
for i in $(seq 1000 1000 10000); do
awk 'c&&c--;/IDENTIFIER/{c=12,000}' out${i}.txt >> out-final.txt
done
我使用这种方法来专门识别每个块的第二行,因为这些数字可以在块本身内重复。但是,我不知道如何修改第二个命令行,以便它仅在 IDENTIFIER 之后的值是序列中的下一个数字时打印到 out-final.txt。
【问题讨论】:
标签: for-loop awk pattern-matching