我有一个很大的文本文件,其中包含很长的值列表。从该文件中,我需要提取大小,表面积和体积的值,然后将其重新排列为标题相应的列。
数据当前具有以下格式:
{不需要的数据列}
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脚本编写专家。
答案 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)
sed
读取连续的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