使用bash实用程序提取文本数据

使用bash实用程序提取文本数据,bash,text,multiple-columns,Bash,Text,Multiple Columns,我有一项非常重要的任务,就是从大型CSV日志中提取一些相关数据 Frame #,Residue,Internal,van der Waals,Electrostatic,Polar Solvation,Non-Polar Solv.,TOTAL 1,1,119.745,0.356,-132.009,-95.618,1.7886312,-105.7373688 1,2,106.093,-3.835,-182.473,40.582,0.7132608,-38.9197392 1,3,21.228,-

我有一项非常重要的任务,就是从大型CSV日志中提取一些相关数据

Frame #,Residue,Internal,van der Waals,Electrostatic,Polar Solvation,Non-Polar Solv.,TOTAL
1,1,119.745,0.356,-132.009,-95.618,1.7886312,-105.7373688
1,2,106.093,-3.835,-182.473,40.582,0.7132608,-38.9197392
1,3,21.228,-1.744,-38.026,-7.707,1.1189664,-25.1300336
1,4,-5.717,-4.721,-30.38,-4.839,0.406512,-45.250488
1,5,70.846,-4.127,-53.317,-2.534,0.7808472,11.6488472
...
2,1,119.745,0.356,-132.009,-95.618,1.7886312,-105.7373688
2,2,106.093,-3.835,-182.473,40.582,0.7132608,-38.9197392
2,3,21.228,-1.744,-38.026,-7.707,1.1189664,-25.1300336
2,4,-5.717,-4.721,-30.38,-4.839,0.406512,-45.250488
2,5,70.846,-4.127,-53.317,-2.534,0.7808472,11.6488472
...
n,1,119.745,0.356,-132.009,-95.618,1.7886312,-105.7373688
n,2,106.093,-3.835,-182.473,40.582,0.7132608,-38.9197392
n,3,21.228,-1.744,-38.026,-7.707,1.1189664,-25.1300336
n,4,-5.717,-4.721,-30.38,-4.839,0.406512,-45.250488
n,5,70.846,-4.127,-53.317,-2.534,0.7808472,11.6488472
在这里,我想从第二列剩余中选择一个指定的值,并根据第一列帧号编写最后一列总能量的snapshot number列的演化函数。换句话说,我需要首先按照第二列对所有数据进行排序:即选择第二列中的数字等于指定值的每个字符串,即n=27

#Frame, #Residue

1,27, ... , # last column value which is interested for me!
2,27, ... , # last column value which is interested for me!
3,27, ... , # last column value which is interested for me!
3,27, ... , # last column value which is interested for me!
然后提取其最后一列的相应值,这样生成的日志将只有3列:

#Frame, #Residue, # Total energy

1,27, # last column value which is interested for me!
2,27, # last column value which is interested for me!
3,27, # last column value which is interested for me!
3,27, # last column value which is interested for me!
感谢您使用awk和sed实现

谢谢


Gleb要提取第二列中有27行的行,可以使用grep:

要仅输出第1、第2和第8列,请使用剪切:

要按第二列对文件进行排序,可以使用“排序”:


要提取第二列中有27行的行,可以使用grep:

要仅输出第1、第2和第8列,请使用剪切:

要按第二列对文件进行排序,可以使用“排序”:


以下是一个awk解决方案:

awk -v n=27 'BEGIN { OFS = FS = "," } $2 == n { print $1, $2, $NF }' input.csv
-v n=27-首先将awk变量n赋值为27 BEGIN{OFS=FS=,}-在awk开始解析任何数据之前运行BEGIN部分。在这里,我们将FS字段分隔符和OFS输出字段分隔符都设置为,,以便输入行和输出行都用逗号拆分/分隔。 $2==n{print$1,$2,$NF}-对于第二个字段$2等于n的任何记录行,输出第一个、第二个和最后一个字段。 要在m个匹配后停止:


以下是一个awk解决方案:

awk -v n=27 'BEGIN { OFS = FS = "," } $2 == n { print $1, $2, $NF }' input.csv
-v n=27-首先将awk变量n赋值为27 BEGIN{OFS=FS=,}-在awk开始解析任何数据之前运行BEGIN部分。在这里,我们将FS字段分隔符和OFS输出字段分隔符都设置为,,以便输入行和输出行都用逗号拆分/分隔。 $2==n{print$1,$2,$NF}-对于第二个字段$2等于n的任何记录行,输出第一个、第二个和最后一个字段。 要在m个匹配后停止:


您可以在27之后添加逗号,否则它可以匹配最大的数字,如270、271、271337…:grep'^[^,]\+,27,'input.csv | cut-d,-f1,2,8\+在POSIX基本正则表达式中未定义,因此您依赖的是一个grep,它碰巧将\+视为1或更多。也就是说,它真的应该是!一个问题:在从初始data.csv进行第i次提取后,向脚本添加什么来停止行的提取?E、 g使用此命令仅提取n行。@user3470313:您可以将输出通过管道传输到head。您可以在27后添加逗号,否则它可以匹配最大的数字,如270、271、271337…:grep'^[^,]\+,27,'input.csv | cut-d,-f1,2,8\+在POSIX基本正则表达式中未定义,因此,您依赖的是一个grep,它碰巧将\+表示1或更多。也就是说,它真的应该是!一个问题:在从初始data.csv进行第i次提取后,向脚本添加什么来停止行的提取?E、 g使用此命令仅提取n行。@user3470313:您可以通过管道将输出传输到head.thx!问题又来了:在从初始data.csv进行第i次提取后,向脚本中添加什么来停止这样的行提取?E、 g使用这样的命令仅提取n行。thx!问题又来了:在从初始data.csv进行第i次提取后,向脚本中添加什么来停止这样的行提取?E、 g使用此命令仅提取n行。
sort -t, -nk2,2 input.csv
      |   | |
delimiter | |
    numeric |
    sort    by only the second field
awk -v n=27 'BEGIN { OFS = FS = "," } $2 == n { print $1, $2, $NF }' input.csv
awk -v n=27 -v m=3 'BEGIN { OFS = FS = "," } $2 == n { print $1, $2, $NF; if (++count == m) exit}' input.csv