如何从文本文件中提取值并使用Bash重新排列它们?

时间:2019-12-09 10:44:58

标签: linux bash ubuntu

我有一个很大的文本文件,其中包含很长的值列表。从该文件中,我需要提取大小,表面积和体积的值,然后将其重新排列为标题相应的列。

数据当前具有以下格式:

{不需要的数据列}

magnitude         :             38.662 +-    0.0556 N        
surface area      :             31.882 +-    0.0584 m^2
volume            :             545.56 +-    0.6562 m^3       

{不需要的数据列}

magnitude         :             38.682 +-    0.0606 N        
surface area      :             31.832 +-    0.0587 m^2
volume            :             545.78 +-    0.6362 m^3 

必填输出:

magnitude         surface area          volume
38.662+-0.0556 N  31.882+-0.0584 m^2    545.56+-0.6562 m^3
38.682+-0.0606 N  31.832+-0.0587 m^2    545.78+-0.6362 m^3

我正在使用bash并尝试过:

grep -e 'magnitude|surface area|volume' '{print}' original_file.txt > new_file.txt

我不是Bash脚本编写专家。

2 个答案:

答案 0 :(得分:0)

嗯,很可能不是最优雅的解决方案,但是它应该可以工作:

awk -F':' 'BEGIN { print "magnitude\tsurface area\tvolume" } /magnitude/,/volume/{gsub(/[ \t]+/, "", $2); printf $(2); printf " "; if (/volume/){printf "\n"}}' YOUR_FILE.txt

这将产生:

magnitude   surface area    volume
38.662+-0.0556N 31.882+-0.0584m^2 545.56+-0.6562m^3 
38.662+-0.0556N 31.882+-0.0584m^2 545.56+-0.6562m^3 

输入:

junk
junk
junk
magnitude         :             38.662 +-    0.0556 N        
surface area      :             31.882 +-    0.0584 m^2
volume            :             545.56 +-    0.6562 m^3  
junk
junk
magnitude         :             38.662 +-    0.0556 N        
surface area      :             31.882 +-    0.0584 m^2
volume            :             545.56 +-    0.6562 m^3  
junk

使用gawk

gawk -F':' 'BEGIN { print "magnitude\tsurface area\tvolume" } /magnitude/,/volume/{gsub(/[ \t]+/, "", $2); $2=gensub(/([Nm]+[23^]*)/, " \\1", "g", $(2)); printf $(2); printf "   "; if (/volume/){printf "\n"}}' YOUR_FILE.txt

结果:

magnitude   surface area    volume
38.662+-0.0556 N   31.882+-0.0584 m^2   545.56+-0.6562 m^3 
38.662+-0.0556 N   31.882+-0.0584 m^2   545.56+-0.6562 m^3 

答案 1 :(得分:0)

  1. Grep感兴趣的行。
  2. 使用sed读取连续的3行并将列分隔符插入输入并合并3行。
  3. 使用column进行输出。

grep 'magnitude\|surface area\|volume' original_file.txt |
sed '
s/^magnitude *: *\([^ ]*\) \([^ ]*\) *\([^ ]* [^ ]*\) */\1\2\3/
N
s/\nsurface area *: *\([^ ]*\) \([^ ]*\) *\([^ ]* [^ ]*\) */|\1\2\3/
N
s/\nvolume *: *\([^ ]*\) \([^ ]*\) *\([^ ]* [^ ]*\) */|\1\2\3/
' |
column -t -s '|' -N 'magnitude,surface area,volume' -o '  '

对于original_file.txt的此类内容:

dfasfdasfa
magnitude         :             38.662 +-    0.0556 N
surface area      :             31.882 +-    0.0584 m^2
volume            :             545.56 +-    0.6562 m^3
fasdfdasfafa
magnitude         :             38.682 +-    0.0606 N
surface area      :             31.832 +-    0.0587 m^2
volume            :             545.78 +-    0.6362 m^3
fdasfdasfa

脚本将输出:

magnitude         surface area        volume
38.662+-0.0556 N  31.882+-0.0584 m^2  545.56+-0.6562 m^3
38.662+-0.0556 N  31.882+-0.0584 m^2  545.56+-0.6562 m^3