如何使用for循环从文本文件中提取数据并将其存储到新文件中?

How to use for loop to extract data from text file and store it to a new file?

我有以下格式的文本数据:

Generated by trjconv : P/L=1/400 t=   0.00000
11214
    1P1     aP1    1  80.48  35.36   4.25
    2P1     aP1    2  37.45   3.92   3.96
    3P2     aP2    3  18.53  -9.69   4.68
    4P2     aP2    4  55.39  74.34   4.60
Generated by trjconv : P/L=2/400 t=   0.00000
11214
    1P1     aP1    1  80.48  35.36   4.25
    2P1     aP1    2  37.45   3.92   3.96
    3P2     aP2    3  18.53  -9.69   4.68
    4P2     aP2    4  55.39  74.34   4.60
Generated by trjconv : P/L=3/400 t=   0.00000
11214
    1P1     aP1    1  80.48  35.36   4.25
    2P1     aP1    2  37.45   3.92   3.96
    3P2     aP2    3  18.53  -9.69   4.68
    4P2     aP2    4  55.39  74.34   4.60
.
.
.

我正在使用 sed 命令提取选定的行

sed -n '3~6p' filename > output_file1

数据有百万行左右,一帧数据有11217行左右。我想提取这些行并将其存储到新文件中。使用此命令我必须执行 11217 次。有人可以展示如何使用 sed 命令进行 for 循环吗?输出应如下所示,

output1.txt
1P1     aP1    1  80.48  35.36   4.25
1P1     aP1    1  80.48  35.36   4.25
1P1     aP1    1  80.48  35.36   4.25
output2.txt
 2P1     aP1    2  37.45   3.92   3.96
 2P1     aP1    2  37.45   3.92   3.96
 2P1     aP1    2  37.45   3.92   3.96
output3.txt
3P2     aP2    3  18.53  -9.69   4.68
3P2     aP2    3  18.53  -9.69   4.68
3P2     aP2    3  18.53  -9.69   4.68
.
.
.
output11217.txt
11217P11217  aP11217 11217 18.53  -9.69   4.68
...
.
.
.

为此使用循环将是一种反模式,只需这样做:

$ cat tst.sh
#!/usr/bin/env bash

awk -v OFS='\t' 'sub(/^ +/,""){print , NR, [=10=]}' "${@:--}" |
sort -k1,1 -k2,2n |
cut -f3- |
awk '
     != prev {
        close(out)
        out = "output" (++c) ".txt"
        prev = 
    }
    { print > out }
'

$ ./tst.sh file

$ head output*
==> output1.txt <==
1P1     aP1    1  80.48  35.36   4.25
1P1     aP1    1  80.48  35.36   4.25
1P1     aP1    1  80.48  35.36   4.25

==> output2.txt <==
2P1     aP1    2  37.45   3.92   3.96
2P1     aP1    2  37.45   3.92   3.96
2P1     aP1    2  37.45   3.92   3.96

==> output3.txt <==
3P2     aP2    3  18.53  -9.69   4.68
3P2     aP2    3  18.53  -9.69   4.68
3P2     aP2    3  18.53  -9.69   4.68

==> output4.txt <==
4P2     aP2    4  55.39  74.34   4.60
4P2     aP2    4  55.39  74.34   4.60
4P2     aP2    4  55.39  74.34   4.60

如果您不确定上面的操作是什么,只需按顺序执行每个命令,在每个步骤中将下一个命令添加到管道中。

这可能适合您(GNU 实用程序):

sed '/^\s/!d;s/^\s*//' file |
sort -ns |
uniq -w 8 --group |
csplit -qf output -b %d.txt --suppress - '/^$/' '{*}'

过滤文件删除不需要的行和 spaces。

使用稳定排序对数字进行排序以保留重复位置。

用 space 行分隔行组。

在 space 行拆分文件。

N.B。输出文件命名为 0 而不是 1.