如何使用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
.
我有以下格式的文本数据:
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
.