要分隔的标题并转换为具有seq编号的列以及unix中的部分文件编号

时间:2013-06-11 11:37:05

标签: unix

我有一个带标题的制表符分隔数据文件。我想拆分该标题并将其存储在另一个文件中,并附带相应的序列和文件编号。

这是原始文件名:

AllResponses_11003_6_7_20132_17_33AM1.txt

这是它包含的信息(第一行是标题):

"ID"    "NAME"  "LOCAL PLACE"   "CONTACT NUM"
a1      bala    pal             kak
ba1     kri     kap             ute

这是我想要获得的输出,也是制表符分隔的:

seq_num  file_num  header_nm
1        11003     ID
2        11003     NAME
3        11003     LOCAL PLACE
4        11003     CONTACT NUM

任何帮助都将不胜感激。


我尝试了以下

#!/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

不是用于分隔符的分隔符而是逐字给出

这是我用你的帮助建立的代码,使用awk但不工作。帮助。

#!/bin/ksh

export INFAHOME=/informat/PowerCenter/9.1.0/server/infa_shared
export SRCDIR=${INFAHOME}/SrcFiles/CSI/INCOMING
export file=${SRCDIR}/AllResponses_11003_6_7_20132_17_33AM1.txt
export file1=AllResponses_11003_6_7_20132_17_33AM1.txt
export name=$(echo $file1 | cut -d_ -f2) #gets 11003

$ awk -v file=$name -F"\t" 'BEGIN{print "seq_num\tfile_num\theader_nm"} NR==1 {for (i=1`enter code here`;i<=NF;i++) {print i"\t"file,"\t"$i}}' $file

低于错误。 Pl帮助

  
      
  • file = 11003'-F \ t''BEGIN {print“seq_num \ tfile_num \ theader_nm”} NR == 1 {for(i = 1; i&lt; = NF; i ++){print i“\ t”file “\ t” 的$ I}}”   /informat/PowerCenter/9.1.0/server/infa_shared/SrcFiles/CSI/INCOMING/AllResponses_11003_6_7_20132_17_33AM1.txt   CSI_SURVEY_FILE_CREA.ksh:第7行:找不到v
  •   

嗨,我还需要一个人的帮助...... 我需要动态传递文件名,并且每个文件需要创建单独的输出文件。帮助。

1 个答案:

答案 0 :(得分:1)

让我们试着用awk和bash混合:

$ file="AllResponses_11003_6_7_20132_17_33AM1.txt"
$ name=$(echo $file | cut -d_ -f2) #gets 11003
$ awk -v file=$name -F"\t" 
      'OFS="\t"; print "seq_num","file_num","header_nm"}
       NR==1 {for (i=1;i<=NF;i++) {print i,file,$i}}' $file
seq_num file_num        header_nm
1       11003   "ID"
2       11003   "NAME"
3       11003   "LOCAL PLACE"
4       11003   "CONTACT NUM"

鉴于

file="AllResponses_11003_6_7_20132_17_33AM1.txt"

该行

name=$(echo $file | cut -d_ -f2) #gets 11003

从字符串1111获取XXXX_1111_YYY_ZZZ_...。然后,此值会保存在$name中,以便awk可以使用它。

awk -v file=$name -F"\t" 'BEGIN{OFS="\t"; print "seq_num","file_num","header_nm"} NR==1 {for (i=1;i<=NF;i++) {print i,file,$i}}' $file
  • -v file=$name。使file变量由awk使用,其值为$name
  • -F"\t"。将制表符设置为分隔符。
  • 'BEGIN{print "seq_num","file_num","header_nm"}。在处理文件之前打印标题。
  • NR==1。只需使用第一行。
  • {for (i=1;i<=NF;i++) {print i,file,$i}}' $file。打印每个字段编号+ $ name + value。