您的文件约会约定:
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
包含您在代码中没有考虑到提取文件序列号的三位数字。
我可能会使用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
打印标题;如果它们需要制表符分隔,那可能会有好处。