あなたのファイル日付規則:
export filename=${SRCDIR}/AllResponses_11003_6_7_20132_17_33AM1.txt
恐ろしいです。次のような表記法を使用すると、多くの作業が楽になります。
filename=${SRCDIR}/AllResponses_11003_2013_06_07_02_17_33_1.txt
または、次のようなよりコンパクトな表記法:
filename=${SRCDIR}/AllResponses_11003_20130607_021733_1.txt
ただし、それは当面の議論に接しています。太陽の下ですべての変数をエクスポートする必要はないことに注意してください。このスクリプトでは、エクスポートされた変数をエクスポートする必要がないことは自明です。
あなたのパス名:
export INFAHOME=/informat/PowerCenter/9.1.0/server/infa_shared
ファイルのシーケンス番号を抽出するために、コードで説明していない 3 桁の数字が含まれています。
awk次のようなスクリプトのバリエーションを使用して、必要に応じてデータを処理するためにおそらく使用します。
#!/bin/bash
INFAHOME=/informat/PowerCenter/9.1.0/server/infa_shared
SRCDIR=${INFAHOME}/SrcFiles/CSI/INCOMING
filename=${SRCDIR}/AllResponses_11003_6_7_20132_17_33AM1.txt
filenum=$(basename $filename | sed 's/^[^_]*_\([0-9][0-9]*\)_.*/\1/')
echo seq_num file_num hname
sed 1q "$filename" |    
awk -F $'\t' -v filenum=$filenum '{ for (i = 1; i <= NF; i++) print i, filenum, $i;}'
bashを使用してコマンドライン$'\t'にタブを埋め込むことができるように、シェルを「切り替え」ました。awk代わりに使用kshして、それを単一引用符、タブ、および別の単一引用符に置き換えることができますが、SO Markdown でスペースとタブを区別するのは困難です。
への割り当ては、ファイル名だけを取得するためにfilenum使用します。愛好家は代わりにbasename書くbashでしょう。${filename##*/}それもおそらくうまくいくでしょうksh。後続のsedコマンドは、一連の非アンダースコアの後にアンダースコアで囲まれた数字の文字列をキャプチャします。
このawkコマンドは、タブを入力フィールド区切り記号として使用するため、タブ区切りの空白を含むタイトル要素を処理します。
次のようなデータ ファイルがあるとします。
TOTAL COUNT     FINAL DAY       LADT COUNT
100     Friday  102
(複数の空白の各シーケンスは、データ ファイルのタブです)、およびfilenum=11003、出力は次のとおりです。
seq_num file_num hname
1 11003 TOTAL COUNT
2 11003 FINAL DAY
3 11003 LADT COUNT
タブ区切りの出力列も必要な場合は、スクリプトに追加OFS="\t";します。awk
awk -F$'\t' -v filenum=11003 '{ OFS="\t"; for (i = 1; i <= NF; i++) print i, filenum, $i;}'
1       11003   TOTAL COUNT
2       11003   FINAL DAY
3       11003   LADT COUNT
sed 1qコマンドは厳密には必要ありません。awk入力の最初の行を除くすべてを無視することもできます。
awk -F $'\t' -v filenum=$filenum 'NR==1 { for (i = 1; i <= NF; i++)
                                              print i, filenum, $i;
                                        }'
awk必要に応じて、見出しを印刷できます。タブで区切る必要がある場合は、メリットがあるかもしれません。