在Unix中,从文件中分割头并将其转换为具有序列号(包括文件号)的列

在Unix中,从文件中分割头并将其转换为具有序列号(包括文件号)的列,unix,Unix,我的输入文件是allresponses_11.txt,它由带有标题的数据组成: ID NAME LOC PH T1 BA KA 99 T2 GT HS 98 我希望输出如下 seq_num file_num hname 1 11 ID 2 11 NAME 3 11 LOC 4 11 PH 请帮助我在unix中获得所需的输出。文件名需要动态传递 在您的帮助下,我制作了如下脚本,但它给出了每个单词的标题输出。我的标题由制表符分隔,标题内有空格 #!/bin/ksh export INFAHOM

我的输入文件是
allresponses_11.txt
,它由带有标题的数据组成:

ID NAME LOC PH
T1 BA KA 99
T2 GT HS 98
我希望输出如下

seq_num file_num hname
1 11 ID
2 11 NAME
3 11 LOC
4 11 PH
请帮助我在unix中获得所需的输出。文件名需要动态传递

在您的帮助下,我制作了如下脚本,但它给出了每个单词的标题输出。我的标题由制表符分隔,标题内有空格

#!/bin/ksh

export INFAHOME=/informat/PowerCenter/9.1.0/server/infa_shared
export SRCDIR=${INFAHOME}/SrcFiles/CSI/INCOMING
export filename=${SRCDIR}/AllResponses_11003_6_7_20132_17_33AM1.txt
export filenum=$(echo $filename | tr -dc 0-9 |cut -c 1-5)

echo seq_num file_num hname

cnt=1
for h in $(head -1 "$filename")
do
    echo $cnt $filenum $h
    cnt=$((cnt+1))
done
我的输出应该是

SEQ_NUM  FILE_NUM  HNAME
1  11003  TOTAL COUNT
2  11003  FINAL DAY
3  11003  LADT COUNT

我的源文件分隔符是tab,但我的标题列名有空格。

虽然您的问题有点缺乏细节,但我认为这至少可以达到您的要求:

filename=allresponses_11.txt
filenum=$(echo ${filename} | tr -dc 0-9)
echo "seq_num file_num hname"
for h in $(head -1 ${filename})
do
  echo "${filenum} ${h}"
done | cat -n

您的文件约会约定在:

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
或更紧凑的符号,例如:

filename=${SRCDIR}/AllResponses_11003_2013_06_07_02_17_33_1.txt
filename=${SRCDIR}/AllResponses_11003_20130607_021733_1.txt
然而,这与手头的讨论无关。注意,您不需要导出sun下的每个变量-在这个脚本中,不需要导出任何导出的变量

您的路径名:

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;}'
(如果多个空白的每个序列是数据文件中的一个选项卡),并且
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

如果您想打印标题,您可以使用
awk
;如果它们需要分开制表符,这可能有好处。

您可以使用awk获得答案


awk-F$'\t'-v filenum=$filenum'{for(i=1;我可以更具体地说明“文件号”(示例中的“11”)的含义吗?脚本不需要任何导出语句就可以工作。您还没有显示第二个示例输出的数据。标题行名称是否应该用小写(
seq_num
等)还是大写(
SEQ_NUM
etc)?