Fix
10:24 21-01-2009 unix
Приперли нам на переобработку данные по 3Д съемке, скинутые на DVD дампом с картриджей в формате SEGD. А такая вещь ни одним пакетом обработки не читается, потому что вообще формат SEGD - это ленточный формат, а тут еще в одном файле оказываются куча сейсмограмм и каждая со своим заголовком.
В общем, пришлось вспоминать свои старые и глубоко забытые за ненадобностью навыки скриптописания, и написать программку для разбиения таких файлов на отдельные сейсмограммки, используя стандартный файл структуры ленты .tpf

А вспоминалось очень тяжело. На отладку программки в 30 строк ушел целый день. А главное, что по tcsh в инете очень мало полезной инфы - все примеры даны для более стандартных sh, bash или же наоборот для более продвинутых zsh, perl, а синтаксис существенно разный.

Это чтобы не забылось и не потерялось - наверняка еще пригодится.


#!/bin/tcsh

#####################################
# Script for split one SEGD file, conteined few records #
# (usually dumped from tape) to separate records #
# For correct work you need additional standart .tpf file #
# whith tape structure information #
# Wrighted by Vladimir Feoktistov, Saratovneftegeofisica #
######################################

# Change work dir, input data file and .tpf file

cd /data2/Kazah
set filename = tape_1.segd.tpf
set inp_sgd = 0001.segd

set a=1
set currec=1
set st_byte=1
set e_byte=0
set size=0
set lines=`wc -l $filename | cut -d" " -f5`
@ words = $lines * 2
@ recs = $lines / 3
set tpflist = `sed "$lines p" $filename`
set outdir = (`echo $inp_sgd | cut -d"." -f1`"_sgd")
mkdir $outdir
while ( $a < $words )
@ st_byte = $st_byte + $e_byte
@ q1 = `echo $tpflist | cut -d" " -f$a`
@ a2 = $a + 1
@ q2 = `echo $tpflist | cut -d" " -f$a2`
@ a3 = $a2 + 1
@ q3 = `echo $tpflist | cut -d" " -f$a3`
@ a4 = $a3 + 1
@ q4 = `echo $tpflist | cut -d" " -f$a4`
@ size = $q1 * $q2 + $q3 * $q4
set uniname = ""
if ( $currec < 10 ) set uniname = 0
set outfile = ($outdir"/"$uniname$currec".sgd")

dd if=$inp_sgd of=$outfile bs=1 skip=$e_byte count=$size

@ currec = $currec + 1
@ e_byte = $e_byte + $size
@ a = $a + 6
end