あなたのファイル日付規則:
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
必要に応じて、見出しを印刷できます。タブで区切る必要がある場合は、メリットがあるかもしれません。