用于从文本文件提取数据的Shell脚本

用于从文本文件提取数据的Shell脚本,shell,csv,awk,extract,Shell,Csv,Awk,Extract,我制作了一个shell脚本,用来提取具有特定字段名的数据,并将它们放入CSV文件中 示例输入文件可能有以下行: user_name: null@gmail.com EMAIL: null@gmail.com FIRST_NAME: jonathan LAST_NAME: doestein CREATION_DATE: 2

我制作了一个shell脚本,用来提取具有特定字段名的数据,并将它们放入CSV文件中

示例输入文件可能有以下行:

                  user_name: null@gmail.com
                      EMAIL: null@gmail.com
                 FIRST_NAME: jonathan
                  LAST_NAME: doestein
              CREATION_DATE: 2013-08-01 01:08:52
        REGISTRATION_STATUS: Y
                     VENDOR: vendorname
这将重复“n”次

这是我到目前为止写的剧本的摘录:

#!/bin/sh

echo "Please enter input file name."
read input_variable
echo "You entered: $input_variable"

echo "Please enter a name of the new output file."
read output_file
touch $output_file
echo "The output file name is going to be $output_file"

echo "Extracting files..."  ;

awk '$1 ~ /^(user_name:|EMAIL:|FIRST_NAME:|LAST_NAME:|CREATION_DATE:|REGISTRATION_STATUS:)$/{printf "%s,",$2} $1 ~ /REGISTRATION_STATUS:/{print $2}' $input_variable >> $output_file.ib ;
然而,尽管数据会打印到我的输出文件(GUI必须是.csv扩展名才能查看),但当我在GUI(如OpenOffice Calc)中打开该文件时,有许多行连接在同一行中,而其他行似乎会像预期的那样开始一个新行

例如,这一行可能如下所示:

noway@gmail.com,noreally51,noway,username,username...x40 or so
#!/bin/sh

echo "Please enter input file name."
read input_variable
echo "You entered: $input_variable"

echo "Please enter a name of the new output file."
touch output_file
read $output_file
echo "The output file name is going to be ${output_file}"

echo "Processing data extraction..." ;

cat $input_variable | awk -F": " -v OFS="," -v n=25
  'NR<=n{sub(/^ */,"",$1);h[NR-1]=$1}
        {a[(NR-1)%n]=$2}
$1~/VENDOR/ && !hp{line=h[0];
                  for(k=1;k<n;k++) line=line OFS h[k];
                  print line;hp=1
                 }
      $1~/VENDOR/{line=a[0];
                  for(k=1;k<n;k++) line=line OFS a[k];
                  print line}' $input_variable ;
echo "Done."
 print line}' $input_variable ;
usnername、用户名、用户名。。。。这意味着它只是在一行中列出大约40-50个用户名,然后转到下一行并打印信息

我想向输出文件中添加列名:

VENDOR,user_name,FIRST_NAME,LAST_NAME,CREATION_DATE,REGISTRATION_STATUS
我不知道该怎么做

感谢您的时间和所有支持

我对我的脚本进行了如下编辑:

#!/bin/sh

echo "Please enter input file name."
read input_variable
echo "You entered: $input_variable"

echo "Please enter a name of the new output file."
touch output_file
read $output_file
echo "The output file name is going to be $output_file"

echo "Processing data extraction..." ;

awk -F": " n=25 -v 'NR<=n {h[NR-1]=$1} {a[NR%n-1]=$2} $1~/VENDOR/ && !hp{for(k=0;k<n;k++) printf "%s ", h[k] $input_variable && print "";hp=1} $1~/VENDOR/{for(k=0;k<n;k++) printf "%s ", a[k] && print ""}' data | column -t $input_variable ;

echo "Done."
@卡拉卡法

这是我手稿的内容。我注意到,在你的回答中,不止第一行的脚本发生了变化。因此,我将我的脚本修改为:

noway@gmail.com,noreally51,noway,username,username...x40 or so
#!/bin/sh

echo "Please enter input file name."
read input_variable
echo "You entered: $input_variable"

echo "Please enter a name of the new output file."
touch output_file
read $output_file
echo "The output file name is going to be ${output_file}"

echo "Processing data extraction..." ;

cat $input_variable | awk -F": " -v OFS="," -v n=25
  'NR<=n{sub(/^ */,"",$1);h[NR-1]=$1}
        {a[(NR-1)%n]=$2}
$1~/VENDOR/ && !hp{line=h[0];
                  for(k=1;k<n;k++) line=line OFS h[k];
                  print line;hp=1
                 }
      $1~/VENDOR/{line=a[0];
                  for(k=1;k<n;k++) line=line OFS a[k];
                  print line}' $input_variable ;
echo "Done."
 print line}' $input_variable ;
然后,我注意到最后一行也写了以下内容:

print line}: No such file or directory
在awk之前有或没有“cat$input|变量|”时都会发生这种情况。通常,awk在我的操作系统上运行良好。它是Mac 10.11.1(15B42)。是#/bin/sh不正确


我期待着您的想法。谢谢大家!

为什么不在awk之前使用echo

echo ENDOR,user_name,FIRST_NAME,LAST_NAME,CREATION_DATE,REGISTRATION_STATUS > file

为什么不在awk之前使用echo

echo ENDOR,user_name,FIRST_NAME,LAST_NAME,CREATION_DATE,REGISTRATION_STATUS > file

如果所有字段始终存在,可以尝试以下
awk
脚本。字段数设置为一个变量(本例中为7),并且“供应商”用作记录指示器的最后一个字段

更新:没有注意到csv输出

$ awk -F": " -v OFS="," -v n=7 
    'NR<=n{sub(/^ */,"",$1);h[NR-1]=$1} 
          {a[(NR-1)%n]=$2} 
 $1~/VENDOR/ && !hp{line=h[0]; 
                    for(k=1;k<n;k++) line=line OFS h[k];
                    print line;hp=1
                   }  
        $1~/VENDOR/{line=a[0];
                    for(k=1;k<n;k++) line=line OFS a[k];
                    print line}' inputfilename


user_name,EMAIL,FIRST_NAME,LAST_NAME,CREATION_DATE,REGISTRATION_STATUS,VENDOR
null@gmail.com,null@gmail.com,jonathan,doestein,2013-08-01 01:08:52,Y,vendorname
$awk-F:“-vofs=”,“-vn=7

'NR如果所有字段始终存在,则可以尝试以下
awk
脚本。字段数设置为一个变量(本例中为7),并且“供应商”用作记录指示器的最后一个字段

更新:没有注意到csv输出

$ awk -F": " -v OFS="," -v n=7 
    'NR<=n{sub(/^ */,"",$1);h[NR-1]=$1} 
          {a[(NR-1)%n]=$2} 
 $1~/VENDOR/ && !hp{line=h[0]; 
                    for(k=1;k<n;k++) line=line OFS h[k];
                    print line;hp=1
                   }  
        $1~/VENDOR/{line=a[0];
                    for(k=1;k<n;k++) line=line OFS a[k];
                    print line}' inputfilename


user_name,EMAIL,FIRST_NAME,LAST_NAME,CREATION_DATE,REGISTRATION_STATUS,VENDOR
null@gmail.com,null@gmail.com,jonathan,doestein,2013-08-01 01:08:52,Y,vendorname
$awk-F:“-vofs=”,“-vn=7


”“谢谢。对问题的其余部分有什么建议吗?或者你对此有什么疑问吗?所有记录都在同一行?这些记录看起来杂乱无章。这一行和其他许多行都有相同的问题,而其他行似乎也有它们应该做的事情,即只有用户名、供应商、创建日期、名字、姓氏和电子邮件地址。还有,有些较短的行仍然包含毫无意义的信息。不能说,我根据您的示例粘贴了几条记录,您的提取非常完美。谢谢。对问题的其余部分有什么建议吗?或者你对此有什么疑问吗?所有记录都在同一行?这些记录看起来杂乱无章。这一行和其他许多行都有相同的问题,而其他行似乎也有它们应该做的事情,即只有用户名、供应商、创建日期、名字、姓氏和电子邮件地址。还有一些较短的行仍然包含毫无意义的信息。不能说,我根据您的示例粘贴了几条记录,您的提取非常完美。我得到了“awk:cannotopenfiledata”,我在“awk-F”前面添加了“cat$input_variable |”。。。但也有同样的错误。另外,如果我的最后一行是“>$output\u file”,如何将其打印到csv文件或$output\u文件?数据是我的文件名。您必须在数据到awk脚本(删除“数据”)中用文件或管道替换。我发现“n=7”不起作用,因为我只为stackoverflow打印了一定数量的数据,因为我认为这是相关的。我已将编辑的脚本添加到原始问题中。请查看更新的脚本。输出字段分隔符现在定义为逗号。7应该适用于给定的数据集。我得到“awk:can't open file data”,并在“awk-F”前面添加了“cat$input_variable”。。。但也有同样的错误。另外,如果我的最后一行是“>$output\u file”,如何将其打印到csv文件或$output\u文件?数据是我的文件名。您必须在数据到awk脚本(删除“数据”)中用文件或管道替换。我发现“n=7”不起作用,因为我只为stackoverflow打印了一定数量的数据,因为我认为这是相关的。我已将编辑的脚本添加到原始问题中。请查看更新的脚本。输出字段分隔符现在定义为逗号。7应适用于给定的数据集。问题在于文件输入(编码或二进制文件),它是文本文件吗?它是文本文件,CSV。您的输出很奇怪,请尝试第一个cat“输入”。然后在不重定向的情况下尝试awk命令>>。问题在于文件输入(编码或二进制文件),它是文本文件吗?它是文本文件,CSV。您的输出很奇怪,请尝试第一个cat“输入”。然后在不重定向的情况下尝试awk命令>>。