Awk:使用多个定义的变量打印到不同的文件

时间:2014-11-22 21:34:48

标签: variables awk assign

我正在打开一个文件并检查第1列和第1列中的项目8符合某些规格。如果是,则将输出写入文件x。如果第1列中的项目与规范匹配,但第8列与规范不匹配,请将输出写入文件y。

我正在定义多个变量(awk -v v = $ var,f1 = $ file,f2 = $ output),我相信我如何引用f1& f2是问题所在。如果我删除引号:

print $0 >> f2
awk: cmd. line:5: (FILENAME=- FNR=2) fatal: expression for `>>' redirection has null string value

如果我输入$:

print $0 >> $f2

我最终得到了一堆我不想要的奇怪名字的文件,而我想要的文件是空的(除了回显的行)。

如果我把“”:

print $0 >> "f2"

我想要的文件几乎是空的,它会创建一个名为f2的文件。

#!/bin/bash

output="output.txt"
echo -e "C1\tSeqID\tAminoAcid\tCD1\tCD2\tCD3\tGene\tEnvironment\tFilename" > $output
inputFile="input.txt.gz"

for var in A B C D E F G H I J K L
do
   file=$var".txt"
   echo -e "C1\tSeqID\tAA\tCD1\tCD2\tCD3\tGene\tEnvironment\tFilename" > $file

   #---Wrong, forgot to catch $8 != v
   #zcat $inputFile |  awk -v v=$var '{
#  if ($8 == v && ($1 == "V1" || $1 == "V2" || $1 == "V3" || $1 == "V4" || $1 == "V5" || $1 == "V6" || $1 == "V7" || $1 == "V8" || $1 == "V9" || $1 == "V10"))
#  print $0
#  }' | tee -a $file $output  

   zcat $inputFile |  awk -v v=$var,f1=$file,f2=$output '{
   if ($8 == v && ($1 == "V1" || $1 == "V2" || $1 == "V3" || $1 == "V4" || $1 == "V5" || $1 == "V6" || $1 == "V7" || $1 == "V8" || $1 == "V9" || $1 == "V10"))
   print $0 >> "file"
   else if ($8 != v && ($1 == "V1" || $1 == "V2" || $1 == "V3" || $1 == "V4" || $1 == "V5" || $1 == "V6" || $1 == "V7" || $1 == "V8" || $1 == "V9" || $1 == "V10"))
   print $0 >> "f2"
   }' 

   gzip $file
done

gzip $output

我可以通过循环运行并有两个单独的awk命令写入不同的文件。但是,它是一个非常大的文件(4G压缩),使用我当前的方法(或类似的东西)更有效。有关如何参考第二个和第二个的任何指导第三个变量非常感谢。

2 个答案:

答案 0 :(得分:2)

使用单独的-v s:

awk -v v="$var" -v f1="$file" -v f2="$output" '...'

答案 1 :(得分:0)

% awk -v v=qw,f1=we,f2=as 'BEGIN{print v, "*", f1, "*", f2}'
qw,f1=we,f2=as *  * 
% awk -v v=qw -v f1=we -v f2=as 'BEGIN{print v, "*", f1, "*", f2}'
qw * we * as
% 

你还需要其他什么吗?