在科研工作中常常需要处理大量文本数据,Windows 下的 bat 脚本语法并不那么简单易学,所以打算在博客中更新一些常用的脚本以供借鉴。

比如现在我有 100 个 txt 文件,里面的内容都是:

窗前明月光,疑是地上霜,
举头望明月,低头思故乡。

现在想把所有的 txt 文本内容整合到一个文本文件中。利用 type *.txt > result.dat 命令后发现结果有时并不那么如意:

窗前明月光,疑是地上霜,
举头望明月,低头思故乡。窗前明月光,疑是地上霜,
举头望明月,低头思故乡。窗前明月光,疑是地上霜,
… …

这是因为 type 命令只是将各个文本直接连在一起而并没有自动添加换行。

可以稍微修改一下命令来达到目的:

@echo off
for %%i in (*.txt) do type %%i >>result.dat  &&  echo. >> result.dat

窗前明月光,疑是地上霜,
举头望明月,低头思故乡。
窗前明月光,疑是地上霜,
举头望明月,低头思故乡。
… …

OK,问题解决。

难度提升,现在有很多个类似 L13056H00.txt 这种命名格式(2013 年第 56 天 00 时)的 TEC 数据文件,想要从第 5 行开始把每个文件的 1,2,6 列提取出来单独绘图:

setlocal enabledelayedexpansion
for /f %%i in ('dir /s/b "..\*.txt"') do (
set R=-R70/140/15/55
set J=-JM8i
gmtset BASEMAP_TYPE plain
gmtset TICK_LENGTH 0
gmtset HEADER_FONT 0 HEADER_FONT_SIZE 18 ANNOT_FONT_SIZE 16
set file=%%i
echo !file!
set PS=!file:~-13,9!.ps
gawk "{if (NR>4) print $1,$2,$6}" !file! > data.txt
surface !R! -I0.25 data.txt -Gdata.grd
rem makecpt -Crainbow -T-18/18/5 -Z > cpt
grdimage data.grd -Ccpt !R! !J! -K > !PS!
psscale -Ccpt -D8.7/2.9/5.7/0.2 -B5 -K -O >> !PS!
psbasemap -R -J -B10/5:."@~D@~VTEC Map ( !file:~-13,9! )": -K -O >> !PS!
psxy CHINA.xyz -R -J -W0.5p,black -M -K -O >> !PS!
psxy 震中经纬度.dat -R -J -Sa0.3 -Gblack -W0.5p,black -O >> !PS! 
ps2raster !PS! -Tj -P -C-sFONTPATH=C:/Windows/fonts
del .gmt* data.txt inter.xyz data.grd 
) 

效果见 电子密度示意图:

电子密度示意图

利用 convert 命令将这一天的 jpg 制作成动态图:

convert -delay 20  L13056*.jpg -loop 0  L13056.gif

效果见 电子密度变化图:

电子密度变化图